字節順序函數:
小端字節序:將低序字節存儲在起始地址。(linux)
大端字節序:將高序字節存儲在起始地址。(網絡字節序)
舉個例子:對於整數0x12345678來說,在不同的系統中存放的方式如下圖:
正是因爲網際協議採取的是大端字節序,我們在編程的時候才需要考慮網絡字節許和主機字節序之間的轉換。下面是四個轉換函數(在某些採用大端字節序的系統裏面,這四個函數被定位空宏):
- #include <netinet/in.h>
- uint16_t htons(uint16_t host16bitvalue);
- uint32_t htonl(uint32_t host32bitvalue); //均返回網絡字節序
- uint16_t ntohs(uint16_t net16bitvalue);
- uint32_t ntohl(uint32_t net32bitvalue); //均返回主機字節序
地址轉換函數:
下面介紹兩組地址轉換函數。首先是第一組:
- #include <arpa/inet.h>
- int inet_aton(const char *strptr, struct in_addr *addrptr);
- //返回:1——串有效,0——串有錯
- char* inet_ntoa(struct in_addr inaddr);
- //返回一個指向ASCII字串的指針
- in_addr_t inet_addr(const char *strptr);
- //成功返回網絡字節序,錯誤返回INADDR_NONE
接下來是第二組,這兩個函數比較新,對於IPv4和IPv6都能處理。p的含義是presentation,代表ASCII字串。n的含意是numberic,代表網絡地址值。
- #include <netinet/in.h>
- #define INET_ADDRSTRLEN 16
- #define INET6_ADDRSTRLEN 46
- #include <arpa/inet.h>
- int inet_pton(int family, const char *strptr, void *addrptr);
- //返回:1——成功,輸入的不是有效表達格式,-1——出錯
- const char* inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
- //返回:指向結果的指針——成功,NULL——出錯