使用winsock2.h的connect函数出现WSAHOST_NOT_FOUND错误求助
解决Winsock connect返回WSAHOST_NOT_FOUND(11001)的问题
问题分析
WSAHOST_NOT_FOUND错误表示主机名解析失败,即getaddrinfo无法将传入的host_name解析为有效IP地址,后续connect操作自然无法建立连接。
排查与修复步骤
- 确认
host_name变量有效性:
确保host_name已正确初始化为有效域名(如"www.google.com"),无拼写错误,也不是空字符串或未初始化的野指针。 - 检查
getaddrinfo执行结果:
原代码未判断getaddrinfo返回值,若该函数执行失败,result会为NULL,后续循环不会执行,直接进入连接失败分支。必须添加返回值检查:int addr_result = getaddrinfo(host_name, port, &hints, &result); if (addr_result != 0) { std::cout << "\nERROR: getaddrinfo failed: " << addr_result << std::endl; WSACleanup(); return addr_result; } - 验证系统DNS解析能力:
打开命令提示符执行ping www.google.com,若无法解析域名,说明系统DNS配置存在问题。可尝试更换公共DNS服务器(如8.8.8.8或114.114.114.114)后重新测试。 - 调整地址族配置:
原代码hints.ai_family = AF_INET强制使用IPv4,但部分域名可能仅支持IPv6解析,导致getaddrinfo无法返回有效地址。可改为AF_UNSPEC让系统自动适配IPv4/IPv6:hints.ai_family = AF_UNSPEC; - 检查
WSAStartup执行状态:
原代码未判断WSAStartup返回值,若初始化失败,后续所有Winsock操作都会异常。添加检查:int wsa_result = WSAStartup(MAKEWORD(2, 2), &wsa_data); if (wsa_result != 0) { std::cout << "\nERROR: WSAStartup failed: " << wsa_result << std::endl; return wsa_result; }
完整修正后的核心代码片段
constexpr auto DEFAULT_PORT = "27015"; constexpr auto DEFAULT_BUFLEN = 512; #pragma comment(lib, "Ws2_32.lib") #include <winsock2.h> #include <ws2tcpip.h> #include <iostream> int main() { WSADATA wsa_data; SOCKET sock = INVALID_SOCKET; addrinfo* result = NULL; addrinfo* ptr = NULL; addrinfo hints{}; PCSTR port = DEFAULT_PORT; const char* host_name = "www.google.com"; // 确保此处初始化正确 // 检查WSAStartup结果 int wsa_result = WSAStartup(MAKEWORD(2, 2), &wsa_data); if (wsa_result != 0) { std::cout << "\nERROR: WSAStartup failed: " << wsa_result << std::endl; return wsa_result; } ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; // 适配IPv4/IPv6 hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // 检查getaddrinfo结果 int addr_result = getaddrinfo(host_name, port, &hints, &result); if (addr_result != 0) { std::cout << "\nERROR: getaddrinfo failed: " << addr_result << std::endl; WSACleanup(); return addr_result; } for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) { sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (sock == INVALID_SOCKET) { std::cout << "\nERROR: socket failed: " << WSAGetLastError() << std::endl; freeaddrinfo(result); WSACleanup(); return WSAGetLastError(); } if (connect(sock, ptr->ai_addr, (int)ptr->ai_addrlen) == SOCKET_ERROR) { int err = WSAGetLastError(); std::cout << "\nWARNING: connect failed: " << err << std::endl; closesocket(sock); sock = INVALID_SOCKET; continue; } break; } freeaddrinfo(result); if (sock == INVALID_SOCKET) { std::cout << "\nERROR: unable to connect to server!\n"; WSACleanup(); return WSAGetLastError(); } // 后续通信逻辑... closesocket(sock); WSACleanup(); return 0; }
内容的提问来源于stack exchange,提问作者Sky64Redstone
相关产品推荐
相关产品推荐

