網路位元組序與本機位元組序

2021-09-26 03:36:49 字數 3261 閱讀 9771

在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...