2

我想将一个结构从我的客户端程序发送到服务器程序(我正在编写服务器程序和客户端程序)。此外,如果我在 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 从主机字节顺序转换为网络字节顺序,但是如果是结构,我该怎么办?非常感激任何的帮助。

4

2 回答 2

4

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

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

// 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,则不必担心这一点,但您会有其他考虑因素,例如不可靠的传递。

于 2012-04-08T20:30:24.613 回答
3

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

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

如果您知道您正在从同一类型的系统发送和接收,则无需转换为网络字节顺序。

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

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

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

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

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

恕我直言...

于 2012-04-08T20:36:59.147 回答