C++网络编程


1173 浏览 5 years, 6 months

2 Socket编程

版权声明: 转载请注明出处 http://www.codingsoho.com/

本章节参考《MUD游戏编程》,非原创。

字节顺序

先说一下字节顺序(byte ording),这个对网络通信非常重要。

在数制中,最靠右边的数字具有最小的权,比如十进制中最右边(个位)是1,往左(十位)是10,二进制与此相同。
因此当数据从8比特增加到16比特时,实际上就假定了新增加的8比特位于原来的8比特的左边。原来的8比特处于低位,新的8比特表示数的高位。

| 地址低位 - 数据高位 | 地址高位 - 数据低位 | 大端存储方式

但是,事情不是那么简单。当计算机转变到16位后,人们意识到有很多代码仍然运行在8位系统上,所以需要处理向后兼容的问题。 16位处理器将它们的内存界限同一调整到16位,即使数据只有8位也是如此。这样就有一个问题,数据在该16位内容里是存放在地址高位(+1)的,通过该地址访问的内容实际在地位。 当然处理器可以自动转换地址,但是这会使处理器复杂很多,大部分芯片商采用的的解决方案是交换字节顺序

| 地址低位 - 数据低位 | 地址高位 - 数据高位 | 小端存储格式

网络传输字节序是大端格式

如何将数据从自己的主机字节序转换为网络字节序呢?Socket API可以很好的解决这一问题。

//从主机字节序转换为网络字节序(长整形)
unsigned long htonl (unsigned long);

//从网络字节序转换为主机字节序(长整形)
unsigned long ntohl(unsigned long);

//从主机字节序转换为网络字节序(短整形)
unsigned short htonl (unsigned short );

//从网络字节序转换为主机字节序(短整形)
unsigned short htonl (unsigned short );