GetAddrInfoExW()中timeout参数为何触发EINVAL无效参数错误?
GetAddrInfoExW传入timeout参数触发EINVAL(10022)错误的原因
你的代码里timeval timeout{ 0, 999 };的问题出在tv_usec字段的取值不符合Windows DNS解析的要求:
当调用GetAddrInfoExW并指定NS_DNS作为名称空间时,timeout参数的tv_usec(微秒)部分必须满足两个条件之一:
- 取值为0
- 取值是1000的整数倍(因为Windows DNS解析器的时间精度是毫秒级,1毫秒=1000微秒)
你设置的999微秒既不是0,也不是1000的整数倍,因此函数判定参数无效,返回10022(EINVAL)。而传入nullptr时,函数会使用默认的超时逻辑,所以能正常执行。
修复方案
- 只设置秒级超时,把tv_usec设为0:
timeval timeout{ 1, 0 }; // 1秒超时 - 设置毫秒级超时,确保tv_usec是1000的倍数:
timeval timeout{ 0, 1000 }; // 1毫秒超时
注意:这个限制是Windows平台特有的,和POSIX系统的行为不同——POSIX允许tv_usec取0到999999之间的任意值,但Windows DNS服务的底层实现只支持毫秒级的超时粒度。
内容的提问来源于stack exchange,提问作者Vasily Starostin
相关产品推荐
相关产品推荐

