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

时间:2015-03-25 04:10:51

标签: c++ c sockets tcp

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

我已经定义了一个“char * buffer”,它将包含我的消息。消息大小为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将此大小复制到charcter缓冲区。

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

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

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

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

如果你能帮助我,我将非常感谢你。我一直试图理解这一点。

2 个答案:

答案 0 :(得分:1)

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

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的情况。 因此,因为int是4个字节,所以这完全解释了为什么首先接收2个零字节。

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

还有htons:简而言之 而htons和htonl的反面是ntohl和ntohs

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

答案 1 :(得分:0)

htonl将长(意味着4字节的int)从host-byte-order转换为network-byte-order。网络字节顺序定义为big-endian,即多字节数字的最重要字节是第一个。 host-byte-order是big-endian(在这种情况下htonl什么都不做)或little-endian(在这种情况下htonl反转字节)。

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