字节排序
必须始终注意主机体系结构用于存储整数的字节顺序与单个传输协议在网络上使用的字节排序之间的任何差异。 对传递到 Windows 套接字例程或从 Windows 套接字例程传递的地址或端口号的任何引用都必须采用网络顺序, (正在使用的协议的 big-endian) 。 对于 IP,这包括 sockaddr 结构的 IP 地址和端口参数 (,但不包括 sin_family 参数) 。
许多 UNIX 系统在 CPU 上运行,这些 CPU 以网络字节顺序表示整数 (big-endian) 。 因此,可以忽略将整数从主机字节顺序转换为网络字节顺序的需求,而不会造成问题,即使不建议这样做以实现可移植性。
相比之下,大多数 Intel® CPU 用于表示整数的字节顺序是小端号。 因此,在 Winsock Sockets 函数和结构中使用之前,必须将整数从主机字节顺序转换为网络字节顺序。
假设一个应用程序通常与时间服务对应的 TCP 端口上的服务器联系,但为用户提供了指定备用端口的机制。 getservbyname 返回的端口号已采用网络顺序,这是构造地址所需的格式,因此不需要转换。 但是,如果用户选择使用其他端口(输入为整数),则应用程序必须在使用 htons 或 WSAHtons 函数) (将此端口从主机转换为 TCP/IP 网络顺序,然后才能使用它构造地址。 相反,如果应用程序要在 getpeername (返回的地址(例如) )内显示端口号,则必须使用 ntohs 或 WSANtohs 函数 () 将端口号从网络转换为主机订单,然后才能显示该端口号。
由于 Intel 和 Internet 字节顺序不同,前面所述的转换是不可避免的。 应用程序编写者应使用作为 Winsock 的一部分提供的标准转换函数,而不是编写自己的转换代码,因为 Winsock 的未来实现很可能在主机顺序与网络字节顺序相同的系统上运行。 只有主机和网络字节顺序之间使用标准转换函数的应用程序才可能可移植。
相关主题