剛才閱讀代碼的時候看到了一個字節(jié)排序函數(shù),一時想不起具體用法了。想想學習linux下的網(wǎng)絡(luò)編程也不少時間了,這些字節(jié)排序和轉(zhuǎn)換的函數(shù)還是不太清楚,容易混淆。今天索性把這方面的知識匯總一下,爭取以后能夠熟練的認識和運用。 字節(jié)順序函數(shù): 小端字節(jié)序:將低序字節(jié)存儲在起始地址。(linux) 大端字節(jié)序:將高序字節(jié)存儲在起始地址。(網(wǎng)絡(luò)字節(jié)序) 舉個例子:對于整數(shù)0x12345678來說,在不同的系統(tǒng)中存放的方式如下圖: 正是因為網(wǎng)際協(xié)議采取的是大端字節(jié)序,我們在編程的時候才需要考慮網(wǎng)絡(luò)字節(jié)許和主機字節(jié)序之間的轉(zhuǎn)換。下面是四個轉(zhuǎn)換函數(shù)(在某些采用大端字節(jié)序的系統(tǒng)里面,這四個函數(shù)被定位空宏): #include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); //均返回網(wǎng)絡(luò)字節(jié)序 uint16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net32bitvalue); //均返回主機字節(jié)序 地址轉(zhuǎn)換函數(shù): 下面介紹兩組地址轉(zhuǎn)換函數(shù)。首先是第一組: #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); //成功返回網(wǎng)絡(luò)字節(jié)序,錯誤返回INADDR_NONE 接下來是第二組,這兩個函數(shù)比較新,對于IPv4和IPv6都能處理。p的含義是presentation,代表ASCII字串。n的含意是numberic,代表網(wǎng)絡(luò)地址值。 #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); //返回:指向結(jié)果的指針——成功,NULL——出錯 |
|