嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)基礎(chǔ)編程
表10.4列出了inet_ntop函數(shù)的語法要點。
表10.4 inet_ntop函數(shù)語法要點
所需頭文件 | #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 | |
出錯:-1 |
4.名字地址轉(zhuǎn)化
(1)函數(shù)說明。
通常,人們在使用過程中都不愿意記憶冗長的IP地址,尤其到IPv6時,地址長度多達(dá)128位,那時就更加不可能一次次記憶那么長的IP地址了。因此,使用主機(jī)名將會是很好的選擇。在Linux中,同樣有一些函數(shù)可以實現(xiàn)主機(jī)名和地址的轉(zhuǎn)化,最為常見的有g(shù)ethostbyname()、gethostbyaddr()和getaddrinfo()等,它們都可以實現(xiàn)IPv4和IPv6的地址和主機(jī)名之間的轉(zhuǎn)化。其中g(shù)ethostbyname()是將主機(jī)名轉(zhuǎn)化為IP地址,gethostbyaddr()則是逆操作,是將IP地址轉(zhuǎn)化為主機(jī)名,另外getaddrinfo()還能實現(xiàn)自動識別IPv4地址和IPv6地址。
gethostbyname()和gethostbyaddr()都涉及一個hostent的結(jié)構(gòu)體,如下所示:
structhostent
{
char*h_name;/*正式主機(jī)名*/
char**h_aliases;/*主機(jī)別名*/
inth_addrtype;/*地址類型*/
inth_length;/*地址字節(jié)長度*/
char**h_addr_list;/*指向IPv4或IPv6的地址指針數(shù)組*/
}
調(diào)用gethostbyname()函數(shù)或gethostbyaddr()函數(shù)后就能返回hostent結(jié)構(gòu)體的相關(guān)信息。
getaddrinfo()函數(shù)涉及一個addrinfo的結(jié)構(gòu)體,如下所示:
structaddrinfo
{
intai_flags;/*AI_PASSIVE,AI_CANONNAME;*/
intai_family;/*地址族*/
intai_socktype;/*socket類型*/
intai_protocol;/*協(xié)議類型*/
size_tai_addrlen;/*地址字節(jié)長度*/
char*ai_canonname;/*主機(jī)名*/
structsockaddr*ai_addr;/*socket結(jié)構(gòu)體*/
structaddrinfo*ai_next;/*下一個指針鏈表*/
}
hostent結(jié)構(gòu)體而言,addrinfo結(jié)構(gòu)體包含更多的信息。
(2)函數(shù)格式。
表10.5列出了gethostbyname()函數(shù)的語法要點。
表10.5 gethostbyname函數(shù)語法要點
所需頭文件 | #includenetdb.h> |
函數(shù)原型 | structhostent*gethostbyname(constchar*hostname) |
函數(shù)傳入值 | hostname:主機(jī)名 |
函數(shù)返回值 | 成功:hostent類型指針 |
出錯:-1 |
調(diào)用該函數(shù)時可以首先對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ù)的語法要點。
表10.6 getaddrinfo()函數(shù)語法要點
所需頭文件 | #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)制的端口號字符串 | |
hints:服務(wù)線索 | |
result:返回結(jié)果 | |
函數(shù)返回值 | 成功:0 |
出錯:-1 |
在調(diào)用之前,首先要對hints服務(wù)線索進(jìn)行設(shè)置。它是一個addrinfo結(jié)構(gòu)體,表10.7列舉了該結(jié)構(gòu)體常見的選項值。
表10.7 addrinfo結(jié)構(gòu)體常見選項值
結(jié)構(gòu)體頭文件 | #includenetdb.h> | |
ai_flags | AI_PASSIVE:該套接口是用作被動地打開 | |
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ù)報套接字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ù)(用于端口和地址的綁定,后面會講到),主機(jī)名nodename通常會設(shè)置為NULL。 (2)客戶端調(diào)用getaddrinfo()時,ai_flags一般不設(shè)置AI_PASSIVE,但是主機(jī)名nodename和服務(wù)名servname(端口)則應(yīng)該不為空。 (3)即使不設(shè)置ai_flags為AI_PASSIVE,取出的地址也可以被綁定,很多程序中ai_flags直接設(shè)置為0,即3個標(biāo)志位都不設(shè)置,這種情況下只要hostname和servname設(shè)置的沒有問題就可以正確綁定。 |
linux相關(guān)文章:linux教程
評論