getaddrinfo函数原型

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

你可能感兴趣的:(socket)