我正在尝试通过 windows(客户端)和 linux(服务器)之间的套接字进行通信。我可以开始通信,但是当我发送数据时,出现问题。 主要问题是我尝试发送 2 个数据 double 和 1 个数据 ulong 但是当我在服务器 (Linux) 上读取它们时我无法读取正确的值。 例如,如果我发送 double1 = 1.5,我会在服务器上收到 0.0000。然后,如果我发送一个 double1 = 550.0,我会在服务器上收到 -12382718421...(垃圾)
我试过用htonl、ntohl等,都不行 我试图重新排序我从客户端发送的帧的字节,即发送 B0 ... B7 而不是 B7 ... B0 ... 它不起作用。 我一直在寻找有关它的信息,但我找不到任何东西,除了不同操作系统之间的套接字通信是可能的,因此我知道有一个解决方案。
我的问题是:
1 - htonl 和 nthol 是否只适用于整数?我可以将这些转换用于 float 据吗?
2 - 在 linux 和 windows 中帧的字节顺序是什么?
3 - 我知道 sendto () 函数返回正在发送的字节数。我发送的是 20Bytes -> (2 * 8Bytes (double) + 1 * 4Bytes (ulong)) = 20Bytes。但是函数返回24Bytes,怎么会这样呢?是因为 UDP 协议(protocol)头还是包含 Windows 的附加信息?
谢谢大家。
PD1:套接字的编程是正确的。
PD2:在Linux-Linux之间我没有问题,我可以正确发送数据。
最佳答案
1 - Does htonl and ntohl only work with integers? Can I use those conversions for float data?
这些函数仅为整数定义。您需要知道每个平台存储 double 的格式(包括字节顺序),以决定是否需要重新排序字节或执行其他转换。
2 - What is the byte order of a frame in linux and windows?
这个问题没有意义。您决定将什么放入此数据包中,因此字节顺序就是您发送的任何内容。
传统的有线格式通常是大端格式,但许多现代格式都是小端格式,因为大多数同行将使用 x86。
对于您的具体情况,与运行 Linux 的体系结构相比,您在 Linux 上接收的事实更不相关。您没有提到这一点,但假设 x86_64、字节序和 double
格式可能与您的发送代码相同。
注意。您可能应该使用 <stdint.h>
中的固定大小类型,例如 uint64_t
而不是 unsigned long
(假设那是你想要的)。像 long
这样的类型即使在同一平台上,不同 ABI 的具体大小也可能不同。
3 - I know that the sendto () function returns the number of bytes that are being sent. What I send are 20Bytes -> (2 * 8Bytes (double) + 1 * 4Bytes (ulong)) = 20Bytes. But the function returns 24Bytes, how can this be? Is it due to UDP protocol headers or is it additional information that includes Windows?
显示您的代码。 sendto
的返回值不应大于您传递的长度参数,因此该值可能不是您所想的。
额外的长度绝对不是 IP 或 UDP header ,它们无论如何都长于 4 个字节。
I have tried to use htonl, ntohl, etc. It does not work
不要为了希望一个有效而四处尝试不同的转换。
在发送之前打印缓冲区的十六进制转储。收到后打印缓冲区的十六进制转储。填写您希望在接收器和十六进制转储中看到的结构,以便您可以看到差异。
关于c - Windows 和 Linux 之间通过套接字进行通信的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54520612/