You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:18