嵌入式Linux网络编程之:网络基础编程
表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教程
评论