在将通过套接字发送的 32 位整数上使用 htonl/ntohl

Using htonl/ntohl on a 32 bit integer that will be sent over a socket

当我查找 htonl 的示例时,它总是 returns 一个 uint32_t。但是,当我在 VS2015 中使用 Winsock2.h 调用 htonl 时,它 returns a u_long

在我的机器上,当我为 32 位和 64 位编译时,我得到 u_long 的大小是 4 个字节。我在网上看到,在 64 位架构中,long 应该是 8 个字节。会是这样吗?我担心如果要通过套接字发送数据时 u_long 与 uint32_t 的字节数不同,我会遇到兼容性问题。

TL;DR - u_long 总是 4 个字节吗?如果不是,您应该如何通过套接字可靠地发送 32 位整数?

u_longtypedefunsigned long,long 又保证(或应该)至少为 32 位 - 即至少 4 个字节。在某些系统上它可能更大 - 但实际上没有办法提前知道。

因此,当您进行网络通信并希望发送大于一个字节的整数时,您必须注意自己限制大小。不要只发送 sizeof 字节,将其限制为四个字节。

此外,在处理整数时,您对 send/receive 数据使用哪种字节顺序的问题不大。 如果你有相同的 OS 双方,这不会是一个问题 - 但如果你在 Windows 和 Linux 之间切换,例如,它可能是。