linux程序设计——主机字节序和网络字节序(第十五章)
2017-08-01 08:18 tlnshuju 阅读(475) 评论(0) 编辑 收藏 举报15.2.10 主机字节序和网络字节序
当在基于intel处理器的linux机器上执行新版本号的server和客户程序时,能够用netstat命令查看网络连接状况.它显示了客户/server连接正在等待关闭.连接将在一段超时间之后关闭,例如以下所看到的:能够看到这条连接相应的server和客户的port号.local address一栏显示的是server,而foreign address一栏显示的是远程客户(即使是在同一台机器上,它仍然是通过网络连接的).为了确保全部套接字都是不同的,这些客户port一般都与server监听套接字不同,而且在这台计算机上是唯一的.
但是,显示的本地地址(server套接字)port号是1574,而选择的是9734.为什么不一样呢?原因是,通过套接字接口传递的port号和地址都是二进制数字,不同的计算机使用不同的字节序来表示整数.比如,Intel处理器将32位的整数分为4个连续的字节,并以字节序1-2-3-4存储在内存中,这里的1表示最高位的字节.而IBM PowerPC处理器是以字节4-3-2-1的方式存储整数.假设保存整数的内存仅仅是以逐个字节的方式来复制,两个不同的计算机得到的整数值就会不一致.
为了使不同类型的计算机能够通过网络传输的多字节整数的值达成一致,须要定义一个网络字节序,客户和server程序必须在传递之前,将它们的内部整数表示方式转换为网络字节序.它们通过定义在头文件netinet/in.h中的函数来完毕这一工作.这些函数例如以下所看到的:
#include <netinet/in.h> unsigned long int htonl(unsigned long int hostlong); unsigned short int htons(unsigned short int hostshort); unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort);这些函数将16位整数和32位整数在主机字节序和标准的网络字节序之间进行转换.函数名是与之相应的转换操作的简写形式.比如"host to network, long"(hton,长整数从主机字节序到网络字节序的转换)和"host to network, short"(htons,短整数从主机字节序到网络字节序的转换).假设计算机本身的主机字节序和网络字节序同样,这些函数的内容实际上就是空操作.
为了保证16位的port号有正确的字节序,server和客户须要这些函数转换port地址.新server程序server3.c中的修改是:
server_address.sin_addr.s_addr = htol(INADDR_ANY); server_address.sin_port = htons(9734);不须要对函数调用inet_addr("127.0.0.1")进行转换,由于inet_addr已被定义为产生一个网络字节序的结果.新程序client3.c中的修改是:
address.sin_port = htons(9734);server也做了修改,通过INADDR_ANY来同意到达server任一网络接口的连接.
执行server3和client3时,看到例如以下所看到的:
使用netstat -A inet将看到本地连接使用的是正确的port: