新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux網絡編程之:網絡基礎編程

        嵌入式Linux網絡編程之:網絡基礎編程

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257116.htm

        表10.4列出了inet_ntop函數的語法要點。

        表10.4 inet_ntop函數語法要點

        所需頭文件

        #includearpa/inet.h>

        函數原型

        intinet_ntop(intfamily,void*addrptr,char*strptr,size_tlen)

        函數傳入值

        family

        AF_INET:IPv4協議

        AF_INET6:IPv6協議

        函數傳入值

        addrptr:轉化后的地址

        strptr:要轉化的值

        len:轉化后值的大小

        函數返回值

        成功:0

        出錯:-1

        4.名字地址轉化

        (1)函數說明。

        通常,人們在使用過程中都不愿意記憶冗長的IP地址,尤其到IPv6時,地址長度多達128位,那時就更加不可能一次次記憶那么長的IP地址了。因此,使用主機名將會是很好的選擇。在Linux中,同樣有一些函數可以實現主機名和地址的轉化,最為常見的有gethostbyname()、gethostbyaddr()和getaddrinfo()等,它們都可以實現IPv4和IPv6的地址和主機名之間的轉化。其中gethostbyname()是將主機名轉化為IP地址,gethostbyaddr()則是逆操作,是將IP地址轉化為主機名,另外getaddrinfo()還能實現自動識別IPv4地址和IPv6地址。

        gethostbyname()和gethostbyaddr()都涉及一個hostent的結構體,如下所示:

        structhostent

        {

        char*h_name;/*正式主機名*/

        char**h_aliases;/*主機別名*/

        inth_addrtype;/*地址類型*/

        inth_length;/*地址字節長度*/

        char**h_addr_list;/*指向IPv4或IPv6的地址指針數組*/

        }

        調用gethostbyname()函數或gethostbyaddr()函數后就能返回hostent結構體的相關信息。

        getaddrinfo()函數涉及一個addrinfo的結構體,如下所示:

        structaddrinfo

        {

        intai_flags;/*AI_PASSIVE,AI_CANONNAME;*/

        intai_family;/*地址族*/

        intai_socktype;/*socket類型*/

        intai_protocol;/*協議類型*/

        size_tai_addrlen;/*地址字節長度*/

        char*ai_canonname;/*主機名*/

        structsockaddr*ai_addr;/*socket結構體*/

        structaddrinfo*ai_next;/*下一個指針鏈表*/

        }

        hostent結構體而言,addrinfo結構體包含更多的信息。

        (2)函數格式。

        表10.5列出了gethostbyname()函數的語法要點。

        表10.5 gethostbyname函數語法要點

        所需頭文件

        #includenetdb.h>

        函數原型

        structhostent*gethostbyname(constchar*hostname)

        函數傳入值

        hostname:主機名

        函數返回值

        成功:hostent類型指針

        出錯:-1

        調用該函數時可以首先對hostent結構體中的h_addrtype和h_length進行設置,若為IPv4可設置為AF_INET和4;若為IPv6可設置為AF_INET6和16;若不設置則默認為IPv4地址類型。

        表10.6列出了getaddrinfo()函數的語法要點。

        表10.6 getaddrinfo()函數語法要點

        所需頭文件

        #includenetdb.h>

        函數原型

        intgetaddrinfo(constchar*node,constchar*service,conststructaddrinfo*hints,structaddrinfo**result)

        函數傳入值

        node:網絡地址或者網絡主機名

        service:服務名或十進制的端口號字符串

        hints:服務線索

        result:返回結果

        函數返回值

        成功:0

        出錯:-1

        在調用之前,首先要對hints服務線索進行設置。它是一個addrinfo結構體,表10.7列舉了該結構體常見的選項值。

        表10.7 addrinfo結構體常見選項值

        結構體頭文件

        #includenetdb.h>

        ai_flags

        AI_PASSIVE:該套接口是用作被動地打開

        AI_CANONNAME:通知getaddrinfo函數返回主機的名字

        ai_family

        AF_INET:IPv4協議

        AF_INET6:IPv6協議

        AF_UNSPEC:IPv4或IPv6均可

        ai_socktype

        SOCK_STREAM:字節流套接字socket(TCP)

        SOCK_DGRAM:數據報套接字socket(UDP)

        ai_protocol

        IPPROTO_IP:IP協議

        IPPROTO_IPV4:IPv4協議

        4

        IPv4

        IPPROTO_IPV6:IPv6協議

        IPPROTO_UDP:UDP

        IPPROTO_TCP:TCP

        注意

        (1)通常服務器端在調用getaddrinfo()之前,ai_flags設置AI_PASSIVE,用于bind()函數(用于端口和地址的綁定,后面會講到),主機名nodename通常會設置為NULL。

        (2)客戶端調用getaddrinfo()時,ai_flags一般不設置AI_PASSIVE,但是主機名nodename和服務名servname(端口)則應該不為空。

        (3)即使不設置ai_flags為AI_PASSIVE,取出的地址也可以被綁定,很多程序中ai_flags直接設置為0,即3個標志位都不設置,這種情況下只要hostname和servname設置的沒有問題就可以正確綁定。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 池州市| 南投市| 沙洋县| 石林| 伽师县| 新密市| 平潭县| 宜兰县| 东台市| 志丹县| 当涂县| 崇左市| 巴中市| 鄂伦春自治旗| 海兴县| 乌海市| 丽水市| 平湖市| 额济纳旗| 慈溪市| 大宁县| 青阳县| 科技| 密云县| 高陵县| 平邑县| 井陉县| 安顺市| 贵溪市| 峨山| 册亨县| 泰顺县| 噶尔县| 高淳县| 马关县| 改则县| 忻州市| 灵璧县| 广水市| 深圳市| 涞水县|