Unix Socket - 網(wǎng)絡字節(jié)順序

不幸的是,并不是所有的計算機都以相同的順序存儲包含多字節(jié)值的字節(jié)??紤]一個由2個字節(jié)組成的16位internet。有兩種方法來存儲這個值。

Little Endian?? 在這種方案中,低階字節(jié)存儲在起始地址(A)上,高階字節(jié)存儲在下一個地址(A + 1)上。

Big Endian?- 在這種方案中,高階字節(jié)存儲在起始地址(A)上,低階字節(jié)存儲在下一個地址(A + 1)上。

為了允許使用不同字節(jié)順序約定的機器相互通信,Internet協(xié)議為在網(wǎng)絡上傳輸?shù)臄?shù)據(jù)指定了規(guī)范的字節(jié)順序約定。這就是所謂的網(wǎng)絡字節(jié)順序。

在建立Internet套接字連接時,必須確保sockaddr_in結構的sin_port和sin_addr成員中的數(shù)據(jù)是以網(wǎng)絡字節(jié)順序表示的。

Byte Ordering Functions

在主機的內部表示和網(wǎng)絡字節(jié)順序之間轉換數(shù)據(jù)的例程如下

htons()??Host to Network Short

htonl()??Host to Network Long

ntohl()??Network to Host Long

ntohs()??Network to Host Short

下面列出了關于這些函數(shù)的更多細節(jié)

unsigned short htons(unsigned short hostshort)?? 該函數(shù)將16位(2字節(jié))數(shù)量從主機字節(jié)順序轉換為網(wǎng)絡字節(jié)順序。

unsigned long htonl(unsigned long hostlong)?? 將32位(4字節(jié))的數(shù)量從主機字節(jié)順序轉換為網(wǎng)絡字節(jié)順序。

unsigned short ntohs(unsigned short netshort)?? 此函數(shù)將16位(2字節(jié))數(shù)量從網(wǎng)絡字節(jié)順序轉換為主機字節(jié)順序。

unsigned long ntohl(unsigned long netlong)?? 將32位的數(shù)量從網(wǎng)絡字節(jié)順序轉換為主機字節(jié)順序。

這些函數(shù)是宏,并導致將轉換源代碼插入到調用程序中。在little-endian計算機上,代碼將根據(jù)網(wǎng)絡字節(jié)順序更改值。在big-endian機器上,不需要插入代碼,因為不需要;這些函數(shù)被定義為null。

確定主機字節(jié)順序的程序

將以下代碼保存在byteorder.c文件中,然后編譯它并在您的機器上運行它。

在本例中,我們將兩個字節(jié)的值0x0102存儲在短整數(shù)中,然后查看兩個連續(xù)的字節(jié)c[0](地址A)和c[1](地址A + 1),以確定字節(jié)順序。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容