日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IPv6名称到地址的转换函数getaddrinfo()详解

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IPv6名称到地址的转换函数getaddrinfo()详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? IPv4中使用gethostbyname()函數完成主機名到地址解析,但是該API不允許調用者指定所需地址類型的任何信息,返回的結構只包含了用于存儲IPv4地址的空間。為了解決該問題,IPv6中引入了getaddrinfo()的新API,它是協議無關的,既可用于IPv4也可用于IPv6。調用該函數會獲得一個addrinfo結構的列表,調用的返回值是addrinfo的結構(列表)指針。 ?????? 本文結合在WinowsXPWindows2003 Server上使用該函數的經驗,對getaddrinfo函數和addrinfo數據結構進行介紹,并對其參數的設置加以討論,主要包括nodenameservname的取值對返回值的影響,hints成員變量的設置對返回值的影響等。 可能有不完全或不準確的地方,歡迎大家討論并指出。 1.getaddrinfo函數原型
函數 參數說明
int getaddrinfo( const char* nodename const char* servname, const struct addrinfo* hints,// struct addrinfo** res ); nodename:節點名可以是主機名,也可以是數字地址。(IPV410進點分,或是IPV616進制) servname:包含十進制數的端口號或服務名如(ftp,http hints:是一個空指針或指向一個addrinfo結構的指針,由調用者填寫關于它所想返回的信息類型的線索。 res:存放返回addrinfo結構鏈表的指針
Getaddrinfo提供獨立于協議的名稱解析。 函數的前兩個參數分別是節點名和服務名。節點名可以是主機名,也可以是地址串(IPv4的點分十進制數表示或IPv6的十六進制數字串)。服務名可以是十進制的端口號,也可以是已定義的服務名稱,如ftphttp等。注意:其中節點名和服務名都是可選項,即節點名或服務名可以為NULL,此時調用的結果將取缺省設置,后面將詳細討論。 函數的第三個參數hintsaddrinfo結構的指針,由調用者填寫關于它所想返回的信息類型的線索。函數的返回值是一個指向addrinfo結構的鏈表指針res 2.addrinfo結構
結構 固定的參數
typedef struct addrinfo {? int ai_flags;? int ai_family;? int ai_socktype;? int ai_protocol;? size_t ai_addrlen;? char* ai_canonname;? struct sockaddr* ai_addr;? struct addrinfo* ai_next; } ai_addrlen must be zero or a null pointer ai_canonname must be zero or a null pointer ai_addr must be zero or a null pointer ai_next must be zero or a null pointer
可以改動的參數
ai_flags:AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST ai_family: AF_INET,AF_INET6 ai_socktype:SOCK_STREAM,SOCK_DGRAM ai_protocol:IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 etc.
3 參數說明 getaddrinfo函數之前通常需要對以下6個參數進行以下設置:nodenameservnamehintsai_flagsai_familyai_socktypeai_protocol 6項參數中,對函數影響最大的是nodenamesernamehints.ai_flag ai_family只是有地址為v4地址或v6地址的區別。而ai_protocol一般是為0不作改動。 其中ai_flagsai_familyai_socktype說明如下:
參數 取值 說明
ai_family AF_INET 2 IPv4
AF_INET6 23 IPv6
AF_UNSPEC 0 協議無關
ai_protocol IPPROTO_IP 0 IP協議
IPPROTO_IPV4 4 IPv4
IPPROTO_IPV6 41 IPv6
IPPROTO_UDP 17 UDP
IPPROTO_TCP 6 TCP
ai_socktype SOCK_STREAM 1
SOCK_DGRAM 2 數據報
ai_flags AI_PASSIVE 1 被動的,用于bind,通常用于server socket
AI_CANONNAME 2
AI_NUMERICHOST 4 地址為數字串
對于ai_flags值的說明:
AI_NUMERICHOST AI_CANONNAME AI_PASSIVE
0/1 0/1 0/1
如上表所示,ai_flagsde值范圍為0~7,取決于程序如何設置3個標志位,比如設置ai_flags?“AI_PASSIVE|AI_CANONNAME”ai_flags值就為3。三個參數的含義分別為: (1)AI_PASSIVE當此標志置位時,表示調用者將在bind()函數調用中使用返回的地址結構。當此標志不置位時,表示將在connect()函數調用中使用。 當節點名位NULL,且此標志置位,則返回的地址將是通配地址。 如果節點名NULL,且此標志不置位,則返回的地址將是回環地址。 (2)AI_CANNONAME當此標志置位時,在函數所返回的第一個addrinfo結構中的ai_cannoname成員中,應該包含一個以空字符結尾的字符串,字符串的內容是節點名的正規名。 (3)AI_NUMERICHOST當此標志置位時,此標志表示調用中的節點名必須是一個數字地址字符串。 4.實際使用的幾種常用設置 一般情況下,client/server編程中,server端調用bind(如果面向連接的還需要listen),client則不用掉bind函數,解析地址后直接connect(面向連接)或直接發送數據(無連接)。因此,比較常見的情況有 (1)?????? 通常服務器端在調用getaddrinfo之前,ai_flags設置AI_PASSIVE,用于bind;主機名nodename通常會設置為NULL,返回通配地址[::] (2)?????? 客戶端調用getaddrinfo時,ai_flags一般不設置AI_PASSIVE,但是主機名nodename和服務名servname(更愿意稱之為端口)則應該不為空。 (3)?????? 當然,即使不設置AI_PASSIVE,取出的地址也并非不可以被bind,很多程序中ai_flags直接設置為0,即3個標志位都不設置,這種情況下只要hostnameservname設置的沒有問題就可以正確bind 上述情況只是簡單的client/server中的使用,但實際在使用getaddrinfo和參考國外開源代碼的時候,曾遇到一些將servname(即端口)設為NULL的情況 (當然,此時nodename必不為NULL,否則調用getaddrinfo會報錯)。以下分情況進行了測試: (1)?????? 如果nodename是字符串型的IPv6地址,bind的時候會分配臨時端口; (2)?????? 如果nodename是本機名,servnameNULL,則根據操作系統的不同略有不同,本文僅在WinXPWin2003上作了測試。 a)???????? WinXP系統(SP2)返回loopback地址[::1] b)??????? Win2003則將本機的所有IPv6地址列表加以返回。因為通常一臺IPv6主機都有可能不止一個IPv6地址,比如fe80::1(本機loopback地址)、fe80::***Link-Local地址、3ffe:***的全局地址等等。這種情況下調用getaddrinfo會將這些地址全部返回,調用者應該注意如何使用這些地址。另外要注意的是,對于fe80::的地址在綁定的時候必須標明接口地址,即使用fe80::20d:60ff:fe78:51c2%4fe80::1%1這樣的地址格式,通過getaddrinfo直接取出fe80地址好像無法直接bind 5.幾句廢話 Windows環境調試IPv6的程序個人感覺還是使用WinXPSP2)和Win2003基本上沒有太大的區別,使用Win2003更規范一些。 VC編寫和調試IPv6的程序一定要安裝Windows較新的SDK,我安裝的是MS_Platform_SDK_Feb_2003,否則庫函數和頭文件可能都會有問題。 ? [參考] [1]MSDN Library – January 2004 ms-help://MS.MSDNQTR.2004JAN.1033/winsock/winsock/getaddrinfo_2.htm ms-help://MS.MSDNQTR.2004JAN.1033/winsock/winsock/addrinfo_2.htm [2]《理解IPv6》("Understanding IPv6”),清華大學出版社 以上測試結果恐有不完善和錯誤的地方,歡迎大家指正,本人聯系方式:wjb@nlsde.buaa.edu.cn 王劍白

總結

以上是生活随笔為你收集整理的IPv6名称到地址的转换函数getaddrinfo()详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。