<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程

          嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程

          作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257116.htm

          表10.4列出了inet_ntop函數(shù)的語(yǔ)法要點(diǎn)。

          表10.4 inet_ntop函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includearpa/inet.h>

          函數(shù)原型

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

          函數(shù)傳入值

          family

          AF_INET:IPv4協(xié)議

          AF_INET6:IPv6協(xié)議

          函數(shù)傳入值

          addrptr:轉(zhuǎn)化后的地址

          strptr:要轉(zhuǎn)化的值

          len:轉(zhuǎn)化后值的大小

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          4.名字地址轉(zhuǎn)化

          (1)函數(shù)說(shuō)明。

          通常,人們?cè)谑褂眠^(guò)程中都不愿意記憶冗長(zhǎng)的IP地址,尤其到IPv6時(shí),地址長(zhǎng)度多達(dá)128位,那時(shí)就更加不可能一次次記憶那么長(zhǎng)的IP地址了。因此,使用主機(jī)名將會(huì)是很好的選擇。在Linux中,同樣有一些函數(shù)可以實(shí)現(xiàn)主機(jī)名和地址的轉(zhuǎn)化,最為常見(jiàn)的有g(shù)ethostbyname()、gethostbyaddr()和getaddrinfo()等,它們都可以實(shí)現(xiàn)IPv4和IPv6的地址和主機(jī)名之間的轉(zhuǎn)化。其中g(shù)ethostbyname()是將主機(jī)名轉(zhuǎn)化為IP地址,gethostbyaddr()則是逆操作,是將IP地址轉(zhuǎn)化為主機(jī)名,另外getaddrinfo()還能實(shí)現(xiàn)自動(dòng)識(shí)別IPv4地址和IPv6地址。

          gethostbyname()和gethostbyaddr()都涉及一個(gè)hostent的結(jié)構(gòu)體,如下所示:

          structhostent

          {

          char*h_name;/*正式主機(jī)名*/

          char**h_aliases;/*主機(jī)別名*/

          inth_addrtype;/*地址類型*/

          inth_length;/*地址字節(jié)長(zhǎng)度*/

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

          }

          調(diào)用gethostbyname()函數(shù)或gethostbyaddr()函數(shù)后就能返回hostent結(jié)構(gòu)體的相關(guān)信息。

          getaddrinfo()函數(shù)涉及一個(gè)addrinfo的結(jié)構(gòu)體,如下所示:

          structaddrinfo

          {

          intai_flags;/*AI_PASSIVE,AI_CANONNAME;*/

          intai_family;/*地址族*/

          intai_socktype;/*socket類型*/

          intai_protocol;/*協(xié)議類型*/

          size_tai_addrlen;/*地址字節(jié)長(zhǎng)度*/

          char*ai_canonname;/*主機(jī)名*/

          structsockaddr*ai_addr;/*socket結(jié)構(gòu)體*/

          structaddrinfo*ai_next;/*下一個(gè)指針鏈表*/

          }

          hostent結(jié)構(gòu)體而言,addrinfo結(jié)構(gòu)體包含更多的信息。

          (2)函數(shù)格式。

          表10.5列出了gethostbyname()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.5 gethostbyname函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includenetdb.h>

          函數(shù)原型

          structhostent*gethostbyname(constchar*hostname)

          函數(shù)傳入值

          hostname:主機(jī)名

          函數(shù)返回值

          成功:hostent類型指針

          出錯(cuò):-1

          調(diào)用該函數(shù)時(shí)可以首先對(duì)hostent結(jié)構(gòu)體中的h_addrtype和h_length進(jìn)行設(shè)置,若為IPv4可設(shè)置為AF_INET和4;若為IPv6可設(shè)置為AF_INET6和16;若不設(shè)置則默認(rèn)為IPv4地址類型。

          表10.6列出了getaddrinfo()函數(shù)的語(yǔ)法要點(diǎn)。

          表10.6 getaddrinfo()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #includenetdb.h>

          函數(shù)原型

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

          函數(shù)傳入值

          node:網(wǎng)絡(luò)地址或者網(wǎng)絡(luò)主機(jī)名

          service:服務(wù)名或十進(jìn)制的端口號(hào)字符串

          hints:服務(wù)線索

          result:返回結(jié)果

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          在調(diào)用之前,首先要對(duì)hints服務(wù)線索進(jìn)行設(shè)置。它是一個(gè)addrinfo結(jié)構(gòu)體,表10.7列舉了該結(jié)構(gòu)體常見(jiàn)的選項(xiàng)值。

          表10.7 addrinfo結(jié)構(gòu)體常見(jiàn)選項(xiàng)值

          結(jié)構(gòu)體頭文件

          #includenetdb.h>

          ai_flags

          AI_PASSIVE:該套接口是用作被動(dòng)地打開(kāi)

          AI_CANONNAME:通知getaddrinfo函數(shù)返回主機(jī)的名字

          ai_family

          AF_INET:IPv4協(xié)議

          AF_INET6:IPv6協(xié)議

          AF_UNSPEC:IPv4或IPv6均可

          ai_socktype

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

          SOCK_DGRAM:數(shù)據(jù)報(bào)套接字socket(UDP)

          ai_protocol

          IPPROTO_IP:IP協(xié)議

          IPPROTO_IPV4:IPv4協(xié)議

          4

          IPv4

          IPPROTO_IPV6:IPv6協(xié)議

          IPPROTO_UDP:UDP

          IPPROTO_TCP:TCP

          注意

          (1)通常服務(wù)器端在調(diào)用getaddrinfo()之前,ai_flags設(shè)置AI_PASSIVE,用于bind()函數(shù)(用于端口和地址的綁定,后面會(huì)講到),主機(jī)名nodename通常會(huì)設(shè)置為NULL。

          (2)客戶端調(diào)用getaddrinfo()時(shí),ai_flags一般不設(shè)置AI_PASSIVE,但是主機(jī)名nodename和服務(wù)名servname(端口)則應(yīng)該不為空。

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

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

          linux相關(guān)文章:linux教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();