【问题标题】:client server comunication via sockets通过套接字进行客户端服务器通信
【发布时间】:2012-04-21 09:55:45
【问题描述】:

我想将一个结构从我的客户端程序发送到服务器程序(我正在编写服务器程序和客户端程序)。此外,如果我在 32 位 OS Linux 上编写代码很重要,那么客户端和服务器都将在相同的系统上运行。这是我的结构:

struct msg_to_server {
    int type_of_msg;
    int type;
    int flag;
    int pid;
    char name[MAX_WORD];
    char client_name[MAX_WORD];
    int child_timeout;
    int numberKilled;
};

我知道如果我要发送一个 int,我需要使用 htonl(int) 将 unsigned int 从主机字节顺序转换为网络字节顺序,但是如果是结构,我该怎么办? 非常感激任何的帮助。

【问题讨论】:

    标签: c sockets client


    【解决方案1】:

    如果您知道您正在从同一种系统发送和接收,则无需将整数转换为网络字节顺序。仅当您在具有不同字节序的系统之间发送时,这一点才重要。

    您至少可以通过套接字简单地发送整个结构的字节,根本不需要翻译步骤。

    // client
    struct msg_to_server msg;
    send(sock, &msg, sizeof(msg), 0);
    
    // server
    struct msg_to_server msg;
    ssize_t n = recv(sock, &msg, sizeof(msg), 0);
    

    但是,请注意,如果您使用 TCP,则该协议可能不会返回您在 recv() 上请求的所有字节。您可能需要多次调用recv() 才能检索客户端发送的所有字节。如果您使用的是 UDP,则不必担心这一点,但您会有其他考虑因素,例如不可靠的传递。

    【讨论】:

    • 即使发送方和接收方是相同的硬件和操作系统,此解决方案也可能很脆弱:例如如果发送程序与接收程序使用不同的编译器设置进行编译,则相同的结构在两个系统上可能具有不同的内存布局,因此接收器上的字节解释不同。
    • 是的,这就是我说“至少”的原因。在两台机器之间发送数据时需要考虑许多可能的问题。不过,在受控环境中很容易解决。
    • 谢谢你们。这些都是有用的 cmets。我不知道。
    【解决方案2】:

    问:我知道如果我发送一个 int 我需要使用 htonl(int) 来 将 unsigned int 从主机字节顺序转换为网络字节顺序, 但是如果是结构,我该怎么办?

    1) 正如 Greg Hewgill 正确指出的那样:

    如果您知道您发送和接收来自同一种 系统,则无需转换为网络字节序。

    2) 否则,如果您认为您可能希望将此二进制结构与非小端主机交换,那么您必须逐个字段地使用 htonl/ntohl 和 htons/ntohs;何时发送,何时接收。

    3) 然而,最好的便携方式是避免通过网络发送二进制记录。

    这正是 XML 或 JSON 等格式大放异彩的地方。

    以及为什么互联网标准(如 HTTP 和 SMTP 等)往往是基于文本的

    如果可能的话,我肯定会在主机之间交换 文本 记录(例如 XML)。

    恕我直言...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 2012-08-30
      • 2012-11-02
      • 2019-08-03
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多