gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:51:46 26 4
gpt4 key购买 nike

我有一个 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 将这个大小复制到字符缓冲区。

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

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

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

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

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

关于c++ - 在两个套接字之间传输整数值 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com