在两个套接字c++之间传输整数值



我有一个c++套接字程序,其中有两个进程。服务器进程和客户端进程。客户端向服务器注册,并在端口上侦听来自服务器的任何消息。

我已经定义了一个"char*缓冲区",它将包含我的消息。消息大小是59000字节。现在,在发送消息之前,我在缓冲区的开头添加消息大小,

size=htonl(59000)
Buffer= size + <Actual Message>

因此,客户端进程在收到消息时,首先读取前两个字节以获取大小,知道发送的消息的大小,然后从套接字中读取完整的消息。如下所示

59000 in binary format is          00000000 00000000 11100110 01111000  
htonl(59000) in binary format is   01111000 11100110 00000000 00000000

我使用memcpy将这个大小复制到字符缓冲区。

memcpy(buffer, &size, 4) <since size of int is 4>

在客户端发送消息后,当我读取前两个字节时,我得到的大小为零。但如果我读取接下来的两个字节,我得到的正确大小是59000。我在客户端读取消息大小的方式如下所述

int messageSize=0;
memcpy(&messageSize, buffer, 2 );

有人能解释一下为什么消息大小存储在后两个字节而不是前两个字节吗。

如果你能帮助我,我将不胜感激。我很长一段时间以来一直在努力理解这一点。

您的解释中有一个严重错误:

59000 in binary format is          00000000 00000000 11100110 01111000  
htonl(59000) in binary format is   01111000 11100110 00000000 00000000

是错误的,它真的是相反的方式,所以

59000 in binary format is          01111000 11100110 00000000 00000000
htonl(59000) in binary format is   00000000 00000000 11100110 01111000  

这就是cpu上的情况,它是little-endian。因此,由于int是4个字节,这就完美地解释了为什么首先接收2个零字节。

htonl代表主机到网络的长度。主机顺序是主机上字节的顺序。这在小端和大端机器上可能有所不同,但网络顺序定义得很好,这一定是因为否则计算机无法相互通信。

还有htons:简称htons和htonl的反面是ntohl和ntohs

这些函数与它们的对应函数做着完全相同的事情,即在大端序系统中,它们什么都不做,在小端序中,它们颠倒了所有输入的字节顺序。htons(htons(x))不起任何作用。如果某个值被字节反转,则无法检测计算机。当从网络订单到主机订单时使用ntohl和ntohs,当您收到前4个字节并想知道长度时,您需要在客户端使用它。

htonl将long(表示4字节int)从主机字节顺序转换为网络字节顺序。网络字节顺序被定义为big-endian,即多字节数中最重要的字节是第一位。主机字节顺序是大端序(在这种情况下htonl什么都不做)或小端序(这种情况下,htonl反转字节)。

在所有情况下,表示59000的字节将作为0x00 0x00 0xe6 0x78进行传输。因此,如果您只读取前两个字节,您将始终获得0x00 0x00。要在所有系统上正确读取值,需要将所有四个字节读取为一个32位整数,然后调用ntohl将数字从网络字节顺序转换为主机字节顺序。

最新更新