.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
当此标志置位时,此标志表示调用中的节点名必须是一个数字地址字符串。