• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            getaddrinfo()詳解

            Posted on 2010-07-02 08:21 S.l.e!ep.¢% 閱讀(3732) 評論(0)  編輯 收藏 引用 所屬分類: VC

            getaddrinfo()詳解 收藏

            IPv4中使用gethostbyname()函數完成主機名到地址解析,但是該API不允許調用者指定 所需地址類型的任何信息,返回的結構只包含了用于存儲IPv4地址的空間。為了解決該問題,IPv6中引入了getaddrinfo()的新API,它是 協議無關的,既可用于IPv4也可用于IPv6。調用該函數會獲得一個addrinfo結構的列表,調用的返回值是addrinfo的結構(列表)指針。

            ??????? 本文結合在WinowsXP和Windows2003 Server上使用該函數的經驗,對getaddrinfo函數和addrinfo數據結構進行介紹,并對其參數的設置加以討論,主要包括 nodename和servname的取值對返回值的影響,hints成員變量的設置對返回值的影響等。

            可能有不完全或不準確的地方,歡迎大家討論并指出。

            1 getaddrinfo函 數原型

            函數

            參數說明

            int getaddrinfo(

            const char* nodename

            const char* servname,

            const struct addrinfo* hints,//

            struct addrinfo** res

            );

            nodename:節點名可以是主機名,也可以是數字地址。(IPV4的10進點分,或是IPV6的16進制)

            servname:包含十進制數的端口號或服務名如(ftp,http)

            hints:是一個空指針或指向一個addrinfo結構的指針,由調用者填寫關于它所想返回的信息類型的線索。

            res:存放返回addrinfo結構鏈表的指針

            Getaddrinfo提供獨立于協議的名稱解析。

            函數的前兩個參數分別是節點名和服務名。節點名可以是主機名,也可以是地址串(IPv4的點分十進制數表示或IPv6的十六進制數字串)。服務名可 以是十進制的端口號,也可以是已定義的服務名稱,如ftp、http等。注意:其中節點名和服務名都是可選項,即節點名或服務名可以為NULL, 此時調用的結果將取缺省設置,后面將詳細討論。

            函數的第三個參數hints是addrinfo結構的指針,由調用者填寫關于它所想返回的信息類型的線索。函數的返回值是一個指向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個參數進行以下設置:nodename、servname、hints的ai_flags、 ai_family、ai_socktype、ai_protocol

            在6項參數中,對函數影響最大的是nodename,sername和hints.ai_flag

            而ai_family只是有地址為v4地址或v6地址的區別。而ai_protocol一般是為0不作改動。

            其中ai_flags、ai_family、ai_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個標志位都不設置,這種情況下 只要hostname和servname設置的沒有問題就可以正確bind。

            上述情況只是簡單的client/server中的使用,但實際在使用getaddrinfo和參考國外開源代碼的時候,曾遇到一些將 servname(即端口)設為NULL的情況

            (當然,此時nodename必不為NULL,否則調用getaddrinfo會報錯)。以下分情況進行了測試:

            (1)??????? 如果nodename是字符串型的IPv6地址,bind的時候會分配臨時端口;

            (2)??????? 如果nodename是本機名,servname為NULL,則根據操作系統的不同略有不同,本文僅在WinXP和Win2003上作了測試。

            a)????????? WinXP系統(SP2)返回loopback地址[::1]

            b)???????? Win2003則將本機的所有IPv6地址列表加以返回。因為通常一臺IPv6主機都有可能不止一個IPv6地址,比如fe80::1(本機 loopback地址)、fe80::***的Link-Local地址、3ffe:***的全局地址等等。這種情況下調用getaddrinfo會將這 些地址全部返回,調用者應該注意如何使用這些地址。另外要注意的是,對于fe80::的地址在綁定的時候必須標明接口地址,即使用 fe80::20d:60ff:fe78:51c2%4或fe80::1%1這樣的地址格式,通過getaddrinfo直接取出fe80地址好像無法直 接bind。

            影音先锋女人AV鲁色资源网久久 | A级毛片无码久久精品免费| 久久婷婷五月综合97色直播| 99久久综合狠狠综合久久止| 99久久成人国产精品免费| 久久强奷乱码老熟女网站| 青青草国产97免久久费观看| 久久精品国产99国产精品| 欧美久久久久久午夜精品| 久久人妻少妇嫩草AV蜜桃| 内射无码专区久久亚洲| 久久久久久久91精品免费观看| 久久久久久伊人高潮影院| 国产毛片欧美毛片久久久| 久久久久亚洲AV成人片| 久久国产乱子伦精品免费强| 热久久国产精品| 中文字幕无码久久精品青草| 精品国产99久久久久久麻豆| 日日躁夜夜躁狠狠久久AV| 久久久久久a亚洲欧洲aⅴ| 久久久久97国产精华液好用吗| 综合久久一区二区三区| 久久精品国产亚洲AV香蕉| 九九久久精品国产| 久久人人爽人人爽人人片AV东京热 | 精品久久久久久成人AV| 国产AV影片久久久久久| 久久只这里是精品66| 俺来也俺去啦久久综合网| 精品久久综合1区2区3区激情| 欧美日韩成人精品久久久免费看| 久久这里只有精品首页| 久久最近最新中文字幕大全 | 久久久久久午夜成人影院 | 香蕉久久永久视频| 午夜不卡久久精品无码免费| 国产高清国内精品福利99久久| 精品久久久一二三区| 国产精品九九久久免费视频| 色综合久久无码中文字幕|