2012-04-08 130 views
2

我想从我的客户端程序发送一个结构到服务器程序(我正在写服务器和客户端程序)。此外,万一重要的是我写在一个32位的操作系统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)的无符号整数从主机字节顺序转换成网络字节顺序,但什么我的情况下,做的结构? 任何帮助将不胜感激。

回答

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,你不必担心这个问题,但是你会有其他的考虑,例如不可靠的交付。

+0

该溶液可以是脆弱的,即使发送者和接收者是相同的硬件和操作系统:例如如果发送程序使用与接收程序不同的编译器设置进行编译,那么相同的结构可能在两个系统上具有不同的内存布局,这样接收器上的字节就会有不同的解释。 – 2012-04-08 21:12:10

+0

是的,这就是为什么我说“至少”。在两台机器之间发送数据时需要考虑许多可能的问题。不过,在受控环境下解决起来相当容易。 – 2012-04-08 21:16:21

+0

谢谢你们两位。这些是有益的评论。我不知道。 – 2012-04-09 01:51:40

3

问:我知道,如果我送一个int我需要使用htonl(int)以 从主机字节顺序转换成unsigned int类型网络字节顺序, 但什么我在的情况下做结构?

1)由于格雷格Hewgill正确地指出:

如果你知道你正在发送和从相同种类 系统的接受,那么就没有必要转换为网络字节顺序。

2)否则,如果你认为你可能永远要与非小端主机交换这种二元结构,则必须使用htonl /再用ntohl和htons/ntohs和在现场逐场的基础;当你发送,当你收到。

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

这恰恰是XML或JSON等格式闪耀的地方。

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

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

IMHO ...

相关问题