字节排序

必须始终注意主机体系结构用于存储整数的字节顺序与单个传输协议在网络上使用的字节排序之间的任何差异。 对传入或传出Windows套接字例程的地址或端口号的任何引用都必须按照网络顺序 (大端) 来使用协议。 对于 IP,这包括 sockaddr 结构的 IP 地址和端口参数 (,但不包括 sin_family参数)

许多UNIX系统在 CPU 上运行,这些 CPU 以网络字节顺序表示整数 (big-endian) 。 因此,即使不建议将整数从主机字节顺序转换为网络字节顺序,也无需引起问题即可忽略。

相比之下,用于表示大多数 Intel® CPU 的整数的字节顺序是小尾数。 因此,在 Winsock Sockets 函数和结构中使用之前,整数必须从主机字节顺序转换为网络字节顺序。

请考虑通常与与时间服务相对应的 TCP 端口上的服务器的应用程序,但为用户指定备用端口提供了一种机制。 getservbyname 返回的端口号已按网络顺序返回,这是构造地址所需的格式,因此不需要转换。 但是,如果用户选择使用其他端口(以整数的形式输入),则应用程序必须在使用 htonsWSAHtons) 函数 (从主机转换为 TCP/IP 网络顺序 (,然后才能使用它构造地址。 相反,如果应用程序要在 getpeer) name 返回的地址 (内显示端口号,则必须使用 ntohsWSANtohs 函数) 将端口号从网络转换为主机顺序 (才能显示。

由于 Intel 和 Internet 字节顺序不同,上述转换是不可避免的。 请注意,应用程序编写器应使用作为 Winsock 的一部分提供的标准转换函数,而不是编写自己的转换代码,因为 Winsock 的未来实现很可能在主机顺序与网络字节顺序相同的系统上运行。 只有使用主机和网络字节顺序之间标准转换函数的应用程序可能可移植。

getpeername

getservbyname

htonl

htons

ntohl

ntohs

将套接字应用程序移植到 Winsock

sockaddr

Winsock 编程注意事项

WSAHtonl

WSAHtons

WSANtohl

WSANtohs