使用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
相关产品推荐
相关产品推荐

