c - Windows 和 Linux 之间通过套接字进行通信的问题

标签 c linux windows sockets floating-point

我正在尝试通过 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/

相关文章:

php - 图像文件未在 Apache Linux Fedora 17 中加载。403 禁止错误

linux - 查找mac地址的等效windows命令

java - Xampp Tomcat 服务(不是有效的 win32)

windows - Emacs - 调用时出错(服务器启动)

c - 使用 libpcap 测量上传/下载速率

c - 在C中打印二维矩阵

c - C中的节点和链表语法

linux - "grep -rnw": search for a string in all files

linux - 使用 shell 脚本将两个命令的输出合并到一个表中

c - 文件输入/输出 : two file pointes