對於ipv4來說,以下三個介面是常用的。
#include
unsigned long pascal far inet_addr( const struct far* cp);
cp:乙個以internet標準「.」間隔的字串。
注釋:本函式解釋cp引數中的字串,這個字串用internet的「.」間隔格式表示乙個數字的internet位址。返回值可用作internet位址。所有internet位址以網路位元組順序返回(位元組從左到右排列)。
internet位址用「.」間隔的位址可有下列幾種表達方式:
a.b.c.d,a.b.c,a.b,a
當四個部分都有定值時,每個都解釋成乙個位元組資料,從左到右組成internet四位元組位址。請注意,當乙個internet位址在intel機器上表示成乙個32位整型數時,則上述的位元組為「d.c.b.a」。這是因為intel處理器的位元組是從右向左排列的。
請注意:只有berkeley支援下述表達法,internet其餘各處均不支援。考慮到與軟體的相容性,應按規定進行使用。
對乙個三部分位址,最後一部分解釋成16位資料並作為網路位址的最右兩個位元組。這樣,三部分位址便很容易表示b組網路位址,如「128.net.host」.
對乙個兩部分位址,最後一部分解釋成24位資料並作為網路位址的最右三個位元組,這樣,兩部分位址便很容易表示c組網路位址,如「net.host」。
對僅有乙個部分的位址,則將它的值直接存入網路位址不作任何位元組的重組。
返回值:
若無錯誤發生,inet_addr()返回乙個無符號長整型數,其中以適當位元組順序存放internet位址。如果傳入的字串不是乙個合法的internet位址,如「a.b.c.d」位址中任一項超過255,那麼inet_addr()返回inaddr_none。
參見:inet_ntoa().
inet_addr()函式的實現
輸入是點分的ip位址格式(如a.b.c.d)的字串,從該字串中提取出每一部分,轉換為ulong,假設得到4個ulong型的a,b,c,d,
uladdress(ulong型)是轉換後的結果,
uladdress = d<<24 + c<<16 + b<<8 + a(網路位元組序),即inet_addr(const char *)的返回結果
另外,我們也可以得到把該ip轉換為主機序的結果,轉換方法一樣
a<<24 + b<<16 + c<<8 + d
inet_ntoa()
簡述:將網路位址轉換成「.」點隔的字串格式。
#include
char far* pascal far inet_ntoa( struct in_addr in);
注釋:
本函式將乙個用in引數所表示的internet位址結構轉換成以「.」 間隔的諸如「a.b.c.d」的字串形式。請注意inet_ntoa()返回的字串存放在windows套介面實現所分配的記憶體中。應用程式不應假設該記憶體是如何分配的。在同乙個執行緒的下乙個windows套介面呼叫前,資料將保證是有效。
返回值:
若無錯誤發生,inet_ntoa()返回乙個字元指標。否則的話,返回null。其中的資料應在下乙個windows套介面呼叫前複製出來。
測試**如下
include
#include
#include
#include
#include
int main(int aargc, char* argv)
實際執行結果如下:
192.168.0.74 : 192.168.0.74 //從這裡可以看出,printf裡的inet_ntoa只執行了一次。
192.168.0.74
211.100.21.179
inet_ntoa返回乙個char *,而這個char *的空間是在inet_ntoa裡面靜態分配的,所以inet_ntoa後面的呼叫會覆蓋上一次的呼叫。第一句printf的結果只能說明在printf裡面的可變引數的求值是從右到左的,僅此而已。
inet_aton()
要想支援ipv6,最新的介面是:inet_pton(),inet_ntop()如下:
linux下這2個ip位址轉換函式,可以在將ip位址在「點分十進位制」和「整數」之間轉換
而且,inet_pton和inet_ntop這2個函式能夠處理ipv4和ipv6。算是比較新的函式了。
inet_pton函式原型如下[將"點分十進位制" -> "整數"]
#include #include #include int inet_pton(int af, constinet_pton是inet_addr的擴充套件,支援的多位址族有下列:char *src, void *dst);
//這個函式轉換字串到網路位址,第乙個引數af是位址族,轉換後存在dst中
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。
inet_ntop函式原型如下[將"點分十進位制" -> "整數"]
#include #include #include const下面是例程:char *inet_ntop(int af, const
void *src, char *dst, socklen_t cnt);
//這個函式轉換網路二進位制結構到ascii型別的位址,引數的作用和上面相同,只是多了乙個引數socklen_t cnt,
//他是所指向快取區dst的大小,避免溢位,如果快取區太小無法儲存位址的值,則返回乙個空指標,並將errno置為enospc
#include #include #include#include #include #include in.h>
int main (void)
python 網路位元組序轉換 網路位元組序
一.位元組序 位元組序是由於不同的主處理器和作業系統,對大於乙個位元組的變數在記憶體中的存放順序不同而產生的。位元組序通常有大端位元組序列和小端位元組序兩種分類方法。由於主機的千差萬別,主機的位元組序不能做到統一,但是網路上傳輸的數值,它們有統一的規定。網路位元組序 是指多位元組變數在網路傳輸時的表...
網路位元組序與主機位元組序的轉換
在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...
網路位元組序與主機位元組序的轉換
在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...