校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 詳解inet_pton()和inet_ntop()函數(shù)

詳解inet_pton()和inet_ntop()函數(shù)

熱門標(biāo)簽:地圖標(biāo)注資源分享注冊 廊坊地圖標(biāo)注申請入口 慶陽外呼系統(tǒng)定制開發(fā) 高德地圖標(biāo)注公司位置需要錢嗎 合肥阿里辦理400電話號 怎么去掉地圖標(biāo)注文字 襄陽外呼增值業(yè)務(wù)線路解決方案 北京外呼系統(tǒng)咨詢電話 海南人工外呼系統(tǒng)哪家好

inet_pton是一個(gè)IP地址轉(zhuǎn)換函數(shù),可以在將IP地址在“點(diǎn)分十進(jìn)制”和“二進(jìn)制整數(shù)”之間轉(zhuǎn)換,而且inet_pton和inet_ntop這2個(gè)函數(shù)能夠處理ipv4和ipv6。算是比較新的函數(shù)了。

1.把ip地址轉(zhuǎn)化為用于網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制數(shù)值

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

inet_aton() 轉(zhuǎn)換網(wǎng)絡(luò)主機(jī)地址ip(如192.168.1.10)為二進(jìn)制數(shù)值,并存儲(chǔ)在struct in_addr結(jié)構(gòu)中,即第二個(gè)參數(shù)*inp,函數(shù)返回非0表示cp主機(jī)有地有效,返回0表示主機(jī)地址無效。(這個(gè)轉(zhuǎn)換完后不能用于網(wǎng)絡(luò)傳輸,還需要調(diào)用htons或htonl函數(shù)才能將主機(jī)字節(jié)順序轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)順序)

in_addr_t inet_addr(const char *cp);

inet_addr函數(shù)轉(zhuǎn)換網(wǎng)絡(luò)主機(jī)地址(如192.168.1.10)為網(wǎng)絡(luò)字節(jié)序二進(jìn)制值,如果參數(shù)char *cp無效,函數(shù)返回-1(INADDR_NONE),這個(gè)函數(shù)在處理地址為255.255.255.255時(shí)也返回-1,255.255.255.255是一個(gè)有效的地址,不過inet_addr無法處理;

2.將網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制數(shù)值轉(zhuǎn)化為成點(diǎn)分十進(jìn)制的ip地址

char *inet_ntoa(struct in_addr in);

inet_ntoa 函數(shù)轉(zhuǎn)換網(wǎng)絡(luò)字節(jié)排序的地址為標(biāo)準(zhǔn)的ASCII以點(diǎn)分開的地址,該函數(shù)返回指向點(diǎn)分開的字符串地址(如192.168.1.10)的指針,該字符串的空間為靜態(tài)分配的,這意味著在第二次調(diào)用該函數(shù)時(shí),上一次調(diào)用將會(huì)被重寫(復(fù)蓋),所以如果需要保存該串最后復(fù)制出來自己管理! 

我們?nèi)绾屋敵鲆粋€(gè)點(diǎn)分十進(jìn)制的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)); //注意這一句的運(yùn)行結(jié)果  
 printf("%s\n", inet_ntoa(addr1));  
 printf("%s\n", inet_ntoa(addr2)); 
 return 0;  
} 

實(shí)際運(yùn)行結(jié)果如下: 

192.168.0.74 : 192.168.0.74          //從這里可以看出,printf里的inet_ntoa只運(yùn)行了一次。  

192.168.0.74  

211.100.21.179  

inet_ntoa返回一個(gè)char *,而這個(gè)char *的空間是在inet_ntoa里面靜態(tài)分配的,所以inet_ntoa后面的調(diào)用會(huì)覆蓋上一次的調(diào)用。第一句printf的結(jié)果只能說明在printf里面的可變參數(shù)的求值是從右到左的,僅此而已。

3.新型網(wǎng)路地址轉(zhuǎn)化函數(shù)inet_pton和inet_ntop

這兩個(gè)函數(shù)是隨IPv6出現(xiàn)的函數(shù),對于IPv4地址和IPv6地址都適用,函數(shù)中p和n分別代表表達(dá)(presentation)和數(shù)值(numeric)。地址的表達(dá)格式通常是ASCII字符串,數(shù)值格式則是存放到套接字地址結(jié)構(gòu)的二進(jìn)制值。

#include arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);   //將點(diǎn)分十進(jìn)制的ip地址轉(zhuǎn)化為用于網(wǎng)絡(luò)傳輸?shù)臄?shù)值格式
    返回值:若成功則為1,若輸入不是有效的表達(dá)式則為0,若出錯(cuò)則為-1
 
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);   //將數(shù)值格式轉(zhuǎn)化為點(diǎn)分十進(jìn)制的ip地址格式
    返回值:若成功則為指向結(jié)構(gòu)的指針,若出錯(cuò)則為NULL

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

(2)第一個(gè)函數(shù)嘗試轉(zhuǎn)換由strptr指針?biāo)赶虻淖址⑼ㄟ^addrptr指針存放二進(jìn)制結(jié)果,若成功則返回值為1,否則如果所指定的family而言輸入字符串不是有效的表達(dá)式格式,那么返回值為0.

(3)inet_ntop進(jìn)行相反的轉(zhuǎn)換,從數(shù)值格式(addrptr)轉(zhuǎn)換到表達(dá)式(strptr)。inet_ntop函數(shù)的strptr參數(shù)不可以是一個(gè)空指針。調(diào)用者必須為目標(biāo)存儲(chǔ)單元分配內(nèi)存并指定其大小,調(diào)用成功時(shí),這個(gè)指針就是該函數(shù)的返回值。len參數(shù)是目標(biāo)存儲(chǔ)單元的大小,以免該函數(shù)溢出其調(diào)用者的緩沖區(qū)。如果len太小,不足以容納表達(dá)式結(jié)果,那么返回一個(gè)空指針,并置為errno為ENOSPC。

4.示例

inet_pton(AF_INET, ip, foo.sin_addr);  // 代替 foo.sin_addr.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)

總結(jié)

以上所述是小編給大家介紹的inet_pton()和inet_ntop()函數(shù),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

標(biāo)簽:商丘 綿陽 平頂山 鶴崗 哈密 鎮(zhèn)江 臺州 株洲

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解inet_pton()和inet_ntop()函數(shù)》,本文關(guān)鍵詞  詳解,inet,pton,和,ntop,函數(shù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解inet_pton()和inet_ntop()函數(shù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解inet_pton()和inet_ntop()函數(shù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 赤峰市| 林芝县| 兴仁县| 蒙城县| 玛纳斯县| 双牌县| 永泰县| 全南县| 满城县| 沾益县| 饶阳县| 赤水市| 高清| 株洲市| 沾益县| 田阳县| 乐山市| 南汇区| 杭锦后旗| 平舆县| 商城县| 河津市| 罗定市| 宁都县| 辽源市| 萝北县| 洪泽县| 小金县| 莱阳市| 景谷| 吴江市| 大埔区| 鄂伦春自治旗| 林甸县| 轮台县| 江津市| 铜鼓县| 金塔县| 沙雅县| 根河市| 崇左市|