計算機在內存中的數據存儲方式有兩種:一種是小端字節序,即內存低地址存儲數據低字節,高地址存儲數據高字節;另外一種是大端字節序,即內存低地址存儲數據高字節,而高地址存儲數據低字節。
如下圖所示:
網絡字節序使用的是大端字節序。某個給定系統所採用的是字節序是主機字節序,他可能是小端字節序(xp、ubuntu等),也可能是大端字節序(aix)。在網絡協議中處理多字節數據(比如int類型數據)採用的都是網絡字節序,而不是主機字節序。要把主機字節序和網絡字節序相對應,就要用到提供主機字節序和網絡字節序之間相互轉換功能的函數。
#include <netinet/in.h>
uint16_t htons(uint16_t hostvalue);
uint32_t htonl(uint32_t hostvalue);
返回網絡字節序#include <netinet/in.h>
uint16_t ntohs(uint16_t netvalue);
uint32_t ntohl(uint32_t netvalue);
返回主機字節序以上函數中,h表示host,n表示network,s表示short,l表示long。一般情況下,使用htos和ntohs轉換端口號,使用htonl和ntohl轉換IP地址。