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

使用winsock2.h编写的客户端服务端连接失败问题求助

问题排查与解决

嘿,我立马就发现了几个导致连接失败的关键问题,咱们一个个来梳理:

1. 客户端目标IP配置错误

这是最核心的问题!你在客户端代码里写了:

server_address.sin_addr.s_addr = INADDR_ANY;

INADDR_ANY是给服务端用的——它告诉服务端的socket绑定到本机所有可用的网络接口上。但客户端需要明确指定要连接的服务端IP地址啊!如果你是在同一台机器上测试,应该用本地回环地址127.0.0.1,或者用宏INADDR_LOOPBACK。把这行改成:

// 方式1:用字符串转IP
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
// 方式2:用回环地址宏
server_address.sin_addr.s_addr = INADDR_LOOPBACK;

2. 缺失关键的错误检查

你的代码里很多系统调用都没做错误判断,这会让你很难定位问题:

  • 服务端的socket()、bind()、listen()调用都可能失败(比如端口被占用、权限不足),你应该检查它们的返回值:
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == INVALID_SOCKET) {
        printf("Socket creation failed! Error Code : %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    
    同理,bind()返回SOCKET_ERROR时也要处理,记得调用WSAGetLastError()获取具体错误码,这能帮你快速定位问题。
  • 客户端connect()返回-1(也就是SOCKET_ERROR)时,一定要打印错误码:
    if (connection_status == SOCKET_ERROR) {
        printf("Connect failed! Error Code : %d\n", WSAGetLastError());
        closesocket(network_socket);
        WSACleanup();
        return 1;
    }
    
    比如这次的问题,如果你打印了错误码,会得到WSAEADDRNOTAVAIL(错误码10049),直接就能指向IP配置错误。

3. 其他小问题(不影响连接但值得修正)

  • 客户端的缓冲区变量名拼写错误:server_respons应该是server_response,虽然不影响运行,但容易造成后续维护混乱。
  • 服务端在发送数据后,应该先关闭客户端socket,再关闭服务端socket:
    send(client_socket, server_message, sizeof(server_message), 0);
    closesocket(client_socket); // 先关客户端连接
    closesocket(server_socket);
    
  • send()和recv()的返回值也建议检查,确保数据成功发送/接收,避免出现数据丢失却没察觉的情况。

修改后的客户端核心代码片段

struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
// 修正IP地址
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

int connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address));
if (connection_status == SOCKET_ERROR) {
    printf("Connect failed! Error Code : %d\n", WSAGetLastError());
    closesocket(network_socket);
    WSACleanup();
    return 1;
}
printf("Connection: %d\n", connection_status);

按这些修改后,再启动服务端和客户端,应该就能成功建立连接并收到服务端的消息啦!

内容的提问来源于stack exchange,提问作者JakobVinkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:22:52