【網路編程】inet_addr、inet_ntoa、inet_aton、inet_ntop和inet_pton區分

來源:互聯網
上載者:User

標籤:緩衝區   eof   二次   位元組序   void   port   include   傳回值   網路位元組序   

先上一張圖

 

1.把ip地址轉化為用於網路傳輸的位元值

int inet_aton(const char *cp, struct in_addr *inp);

inet_aton() 轉換網路主機地址ip(如192.168.1.10)為位元值,並儲存在struct in_addr結構中,即第二個參數*inp,函數返回非0表示cp主機有地有效,返回0表示主機地址無效。(這個轉換完後不能用於網路傳輸,還需要調用htons或htonl函數才能將主機位元組順序轉化為網路位元組順序)

 

in_addr_t inet_addr(const char *cp);

inet_addr函數轉換網路主機地址(如192.168.1.10)為網路位元組序二進位值,如果參數char *cp無效,函數返回-1(INADDR_NONE),這個函數在處理地址為255.255.255.255時也返回-1,255.255.255.255是一個有效地址,不過inet_addr無法處理;


2.將網路傳輸的位元值轉化為成點分十進位的ip地址

char *inet_ntoa(struct in_addr in);

inet_ntoa 函數轉換網路位元組排序的地址為標準的ASCII以點分開的地址,該函數返回指向點分開的字串地址(如192.168.1.10)的指標,該字串的空間為靜態分配的,這意味著在第二次調用該函數時,上一次調用將會被重寫(覆蓋),所以如果需要儲存該串最後複製出來自己管理!

 

我們如何輸出一個點分十進位的IP呢?我們來看看下面的程式:

#include <stdio.h>   #include <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>   #include <string.h>   int main()   {       struct in_addr addr1,addr2;       ulong l1,l2;       l1= inet_addr("192.168.0.74");       l2 = inet_addr("211.100.21.179");       memcpy(&addr1, &l1, 4);       memcpy(&addr2, &l2, 4);       printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意這一句的運行結果       printf("%s\n", inet_ntoa(addr1));       printf("%s\n", inet_ntoa(addr2));      return 0;   }   

實際運行結果如下: 

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裡面的可變參數的求值是從右至左的,僅此而已。

 

3.新型網路地址轉化函數inet_pton和inet_ntop
這兩個函數是隨IPv6出現的函數,對於IPv4地址和IPv6地址都適用,函數中p和n分別代表表達(presentation)和數值(numeric)。地址的表達格式通常是ASCII字串,數值格式則是存放到通訊端地址結構的二進位值。

#include <arpe/inet.h>int inet_pton(int family, const char *strptr, void *addrptr);    
//將點分十進位的ip地址轉化為用於網路傳輸的數值格式
//傳回值:若成功則為1,若輸入不是有效運算式則為0,若出錯則為-1 const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
//將數值格式轉化為點分十進位的ip地址格式//傳回值:若成功則為指向結構的指標,若出錯則為NULL

(1)這兩個函數的family參數既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支援的地址族作為family參數,這兩個函數都返回一個錯誤,並將errno置為EAFNOSUPPORT.

(2)第一個函數嘗試轉換由strptr指標所指向的字串,並通過addrptr指標存放二進位結果,若成功則傳回值為1,否則如果所指定的family而言輸入字串不是有效運算式格式,那麼傳回值為0.

(3)inet_ntop進行相反的轉換,從數值格式(addrptr)轉換到運算式(strptr)。inet_ntop函數的strptr參數不可以是一個null 指標。調用者必須為目標儲存單元分配記憶體並指定其大小,調用成功時,這個指標就是該函數的傳回值。len參數是目標儲存單元的大小,以免該函數溢出其調用者的緩衝區。如果len太小,不足以容納運算式結果,那麼返回一個null 指標,共置為errno為ENOSPC。

inet_pton(AF_INET, ip, &foo.sin_addr);   
//代替 foo.sin_addr.s_addr=inet_addr(ip); char str[INET_ADDRSTRLEN];char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str));
// 代替 ptr = inet_ntoa(foo.sin_addr)

【網路編程】inet_addr、inet_ntoa、inet_aton、inet_ntop和inet_pton區分

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.