在c/c++寫網路程式的時候,往往會遇到位元組的網路順序和主機順序的問題。這是就可能用到htons(), ntohl(),
ntohs(),htons()這4個函式。 網路位元組順序與本地位元組順序之間的轉換函式:
htonl()–「host to network long」
ntohl()–「network to host long」
htons()–「host to network short」
ntohs()–「network to hostshort」
之所以需要這些函式是因為計算機資料表示存在兩種位元組順序:nbo與hbo
網路位元組順序nbo(network byte order): 按從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。
主機位元組順序(hbo,host byte order):不同的機器hbo不相同,與cpu設計有關,資料的順序是由cpu決定的,而與作業系統無關。
由於這個原因不同體系結構的機器之間無法通訊,所以要轉換成一種約定的數序,也就是網路位元組順序,其實就是如同power pc那樣的順序. 在pc開發中有ntohl和htonl函式可以用來進行網路位元組和主機位元組的轉換.
在linux系統下:htonl(),htons(), ntohl(), ntohs()的標頭檔案及函式定義:
#include
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
在windows系統下:htonl(),htons(), ntohl(), ntohs(), inet_addr()使用說明
ntohs() 簡述:
功能:將乙個無符號短整形數從網路位元組順序轉換為主機位元組順序。
#include
u_short pascal far ntohs( u_short netshort);
netshort:乙個以網路位元組順序表達的16位數。 注釋:
本函式將乙個16位數由網路位元組順序轉換為主機位元組順序。
返回值:ntohs()返回乙個以主機位元組順序表達的數。
ntohl() 簡述:
功能:將乙個無符號長整形數從網路位元組順序轉換為主機位元組順序。
#include
u_long pascal far ntohl( u_long netlong);
netlong:乙個以網路位元組順序表達的32位數。
注釋:本函式將乙個32位數由網路位元組順序轉換為主機位元組順序。
返回值: ntohl()返回乙個以主機位元組順序表達的數。
htons() 簡述:
功能:將主機的無符號短整形數轉換成網路位元組順序。
//將無符號短整型主機位元組序轉換為網路位元組序
#include
u_short pascal far htons( u_short hostshort);
hostshort:主機位元組順序表達的16位數。
注釋:本函式將乙個16位數從主機位元組順序轉換成網路位元組順序。
返回值: htons()返回乙個網路位元組順序的值。
htonl()簡述:
功能:將主機的無符號長整形數轉換成網路位元組順序。
//將無符號長整型網路位元組序轉換為主機位元組序
#include
u_long pascal far htonl( u_long hostlong);
hostlong:主機位元組順序表達的32位數。
注釋:本函式將乙個32位數從主機位元組順序轉換成網路位元組順序。
返回值: htonl()返回乙個網路位元組順序的值。
inet_addr() 簡述:
功能:將乙個點間隔位址轉換成乙個in_addr。
#include
unsigned long pascal far inet_addr( const struct far* cp);
cp:乙個以internet標準「.」間隔的字串。
本函式解釋cp引數中的字串,這個字串用internet的「.」間隔格式表示乙個數字的internet位址。
返回值: 乙個無符號長整形數,可用作internet位址。所有internet位址以網路位元組順序返回(位元組從左到右排列)。
inet_ntoa() 簡述:
功能: 將網路位址轉換成「.」點隔的字串格式。
#include
char far* pascal far inet_ntoa( struct in_addr in);
in:乙個表示internet主機位址的結構。
返回值:若無錯誤發生,inet_ntoa()返回乙個字元指標。否則的話,返回null。其中的資料應在下乙個windows套介面呼叫前複製出來。
inet_aton() 與inet_ntoa()作用相反。
注釋:本函式將乙個用in引數所表示的internet位址結構轉換成以「.」 間隔的諸如「a.b.c.d」的字串形式。請注意inet_ntoa()返回的字串存放在windows套介面實現所分配的記憶體中。應用程式不應假設該記憶體是如何分配的。在同乙個執行緒的下乙個windows套介面呼叫前,資料將保證是有效。
當ip位址為255.255.255.255是認為有效ip位址。這是與inet_addr()的區別
inet_pton() 簡述:
功能: 本函式將點分十進位制轉換為整數
#include
#include
#include
int inet_pton(int af, const char src, void dst);
這個函式轉換字串到網路位址,第乙個引數af是位址族,轉換後存在dst中 inet_pton 是inet_addr的擴充套件,支援的多位址族有下列: af = af_inet
src為指向字元型的位址,即ascii的位址的首位址(ddd.ddd.ddd.ddd格式的),函式將該位址 轉換為in_addr的結構體,並複製在dst中 af =af_inet6 src為指向ipv6的位址,,函式將該位址轉換為in6_addr的結構體,並複製在dst中 如果函式出錯將返回乙個負值,並將errno設定為eafnosupport,如果引數af指定的位址族和src格式不對,函式將返回0。
網路位元組序和本機位元組序
1.位元組序定義 是指整數在記憶體中儲存的順序。2.位元組序種類 a.little endinan 低位儲存在記憶體的低位址,高位儲存在記憶體的高位址 b.big endian 高位儲存在記憶體的低位址,低位儲存在記憶體的高位址 3.例子 dword dwcount 0x01020304 這樣的乙個...
位元組序與網路位元組序
cpu向記憶體儲存資料的方式有2種,這意味著cpu解析資料的方式也分為2種 0x20號 0x21號 0x22號 0x23號 0x12 0x32 0x56 0x78 整數0x12345678,0x12是最高位位元組,0x78是最低位位元組。因此大端中先儲存最高位位元組0x12,小端序儲存方式如下 0x...
c 網路位元組序和本機位元組序轉換
將多位元組整數型別的資料,從主機的位元組順序轉化為網路位元組順序 include uint32 t htonl uint32 t hostlong uint16 t htons uint16 t hostshort uint32 t ntohl uint32 t netlong uint16 t n...