我想从我的客户端程序向服务器程序发送一个结构(我正在编写服务器和客户端程序)。此外,如果重要的是我在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从主机字节顺序转换为网络字节顺序,但是如果是struct,我该怎么办? 非常感激任何的帮助。
答案 0 :(得分: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,则不必担心这一点,但您会有其他考虑因素,例如不可靠的交付。
答案 1 :(得分:3)
问:我知道如果我发送一个int,我需要使用htonl(int)来 将unsigned int从主机字节顺序转换为网络字节顺序, 但是如果是结构,我该怎么办?
1)正如Greg Hewgill所说:
如果您知道自己是从同一类型发送和接收的 系统,则无需转换为网络字节顺序。
2)否则,如果您认为您可能想要将此二进制结构与非小端主机交换,那么您必须逐个字段地使用htonl / ntohl和htons / ntohs;当你发送,当你收到。
3)然而,最佳可移植的方式是避免通过网络发送二进制记录。
这正是XML或JSON等格式的亮点。
为什么互联网标准(如HTTP和SMTP等)往往是基于文本的。
如果可能的话,我肯定会在主机之间交换文本记录(例如XML)。
... IMHO