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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:58