網絡字節轉換函數 htons(), htonl(), ntohs(), ntohl()

將多字節整數類型的數據,從主機的字節順序轉化爲網絡字節順序
原型
#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

 

描述
不同的計算機裏對它們的多字節整數(例如:一個大於char的整數)使用不同的字節順序。這就意味着,如果你從intel的盒子中send()一個兩個字節的短整數到一個Mac中(在它們成爲Intel之前),一個計算機認爲是數字1,而另外一個計算機會認爲它是數字256,反之亦然。

解決這個問題的辦法是:所有的人撇開它們的不同之處,同意摩托羅拉和IBM的順序是正確的,而Intel使用的是怪異的方式,所以我們在將他們發送出去之前把所有的字節以“正序”方式排列。既然Intel是一個“反序”的機器,所以調用我們需要的,以“網絡字節順序”排列的字節是很正確的。所以這些函數把你的本機字節順序轉化爲網絡字節順序然後再轉化回來。

(這就意味着,在Intel上面,這些函數把所有的字節調換過來,而在PowerPC上面,它們什麼都沒有做,因爲在那上面字節本身是以網絡字節順序排列的。但是你依然要在你的程序當中使用它們,因爲別的人有可能將它們應用到Intel機器當中,使之依然正常的運行。)

注意到這些類型包含32-位(4個字節,可能是整數)和16-位(兩個字節和short很像)數據。64-位的機器可以使用htonll()作爲64-位整數,但是我們沒有見到它。你必須自己寫。

不管怎樣,使用這些函數決定於你要從主機字節順序(你的電腦上的)還是網絡字節順序轉化。如果是"host",函數的第一個字母爲"h",否則"network"就爲"n"。函數的中間字母總是"to",因爲你要從一個轉化到另一個,倒數第二個字母說明你要轉化成什麼。最後一個字母是數據的大小,"s"表示short,"l"表示long。於是:

                       htons()    host to network short
 
                       htonl()     host to network long
 
                       ntohs()    network to host short
 
                       ntohl()    network to host long
 
返回值
每個函數返回轉化後的值

 

例子
uint32_t some_long = 10;
uint16_t some_short = 20;

 

uint32_t network_byte_order;

 

// convert and send
network_byte_order = htonl(some_long);
send(s, &network_byte_order, sizeof(uint32_t), 0);

 

some_short == ntohs(htons(some_short)); // this expression is true

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章