getaddrinfo()的hints参数应初始化哪些addrinfo结构体成员?
getaddrinfo() hints参数中addrinfo结构体的初始化说明
在使用getaddrinfo()时,传入的hints指针指向的addrinfo结构体,核心是初始化用于控制地址解析行为的成员,除了常见的3个必填成员外,还有可选成员可以按需设置,具体说明如下:
必选初始化成员
这三个成员是控制解析逻辑的基础,建议显式设置以避免歧义:
- ai_family:指定地址族,可选值包括
AF_INET(仅IPv4)、AF_INET6(仅IPv6)、AF_UNSPEC(自动适配IPv4/IPv6)。 - ai_socktype:指定套接字类型,常用值为
SOCK_STREAM(TCP流套接字)、SOCK_DGRAM(UDP数据报套接字)。 - ai_flags:控制解析行为的标志位,常用选项如
AI_PASSIVE(用于创建监听套接字,此时node参数可设为NULL,绑定到通配地址)、AI_CANONNAME(要求返回主机的规范域名)、AI_NUMERICHOST(禁止域名解析,仅接受IP地址字符串)等。
可选设置成员
以下成员可根据需求选择性设置,并非必须:
- ai_protocol:指定协议类型,比如
IPPROTO_TCP(对应TCP)、IPPROTO_UDP(对应UDP)。若设为0,getaddrinfo()会根据ai_socktype自动匹配合适的协议。
无需手动初始化的成员
addrinfo结构体中的以下成员是输出成员,由getaddrinfo()函数在返回结果时自动填充,无需手动设置:
ai_addrlen:返回的sockaddr结构体长度ai_addr:指向sockaddr结构体的指针(存储解析后的地址)ai_canonname:指向规范主机名字符串的指针(仅当设置AI_CANONNAME标志时有效)ai_next:指向链表中下一个addrinfo结构体的指针(用于返回多个解析结果)
初始化注意事项
为避免未初始化的成员干扰解析逻辑,建议先使用memset将结构体清零,再显式设置需要的成员,示例代码如下:
struct addrinfo hints; // 先清零所有成员 memset(&hints, 0, sizeof(hints)); // 显式设置必选成员 hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; // 可选设置协议类型 hints.ai_protocol = IPPROTO_TCP;
内容的提问来源于stack exchange,提问作者onxy tzy
相关产品推荐
相关产品推荐

