客户端服务器通过套接字进行通

时间:2012-04-08 20:27:47

标签: c sockets client

我想从我的客户端程序向服务器程序发送一个结构(我正在编写服务器和客户端程序)。此外,如果重要的是我在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,我该怎么办? 非常感激任何的帮助。

2 个答案:

答案 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