仅Windows 11环境下Winsock调用connect返回WSAEFAULT错误问题
问题原因
- 核心原因是Windows 11对Winsock API的参数校验强度远高于之前的Windows版本,旧版本内置的兼容容错逻辑在Win11中被移除,代码中存在的不规范写法直接触发了严格校验逻辑。
- 具体错误出在套接字创建逻辑:调用
socket()函数创建套接字时第一个参数传入了AF_UNSPEC(未指定地址族),但后续调用connect()时传入的是IPv4专属的sockaddr_in结构体。旧版Windows会自动兼容这种地址族不匹配的情况,Win11则会判定传入的地址结构与套接字类型不匹配,直接抛出WSAEFAULT错误。
解决办法
- 方案1(最快捷,适配现有IPv4逻辑):修改
CConnection::Create()函数中的套接字创建代码,将地址族明确指定为IPv4的AF_INET,修改后的代码如下:
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
修改后即可在Win11上正常运行,同时完全兼容Windows XP到Windows 10的所有系统版本。
- 方案2(长期迭代,适配双栈环境):如果需要同时支持IPv4和IPv6连接,建议将已废弃的
gethostbyname接口替换为getaddrinfo,根据解析得到的地址族动态创建对应类型的套接字,传入匹配的sockaddr结构体及对应长度,完全符合Winsock API规范。
内容的提问来源于stack exchange,提问作者Flavio
相关产品推荐
相关产品推荐

