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

极简TCP客户端-服务端问题:accept()始终无法接收连接?

解决WinSock服务端accept()阻塞不返回、客户端连接失败(10060)的思路

你已经完成了代码的适配编译,现在卡在连接环节,我给你梳理几个按优先级排序的排查方向:

1. 先验证本地连接,排除IP/网络问题

先跳过169.1.1.1,服务端启动后,客户端直接用127.0.0.1测试:

./TCPEchoClientWS.exe 127.0.0.1 "Echo this" 5000

如果这样能连上,说明问题出在两个方向:

  • 服务端绑定地址错误:检查服务端的bind()调用,确保绑定的是INADDR_ANY(即htonl(INADDR_ANY)),而不是某个特定IP(比如127.0.0.1)。如果绑定了特定IP,只有对应网卡的请求能进来,其他网卡的连接会被拒绝。
  • IP地址记错:在服务端机器运行ipconfig,确认网卡的实际IP是不是169.1.1.1——系统可能自动分配了临时IP,或者你记错了机器的局域网地址。

2. 检查服务端监听流程的完整性

编译通过不代表逻辑正确,要确认关键步骤没有静默失败:

  • 确认WSAStartup()初始化成功:代码里必须包含类似下面的逻辑,且检查了返回值:
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        DieWithError("WSAStartup failed");
    }
    
    若WinSock初始化失败,后续socket操作会静默失效,服务端根本没真正监听端口。
  • 检查listen()的返回值:调用listen(servSock, 5)(backlog设为大于0的数值)后,要确认返回值不是SOCKET_ERROR。如果listen失败,服务端未进入监听状态,accept自然会永远阻塞。
  • 用netstat -ano | findstr :5000验证监听状态:如果输出里没有LISTENING状态的条目,说明服务端的socket创建/绑定/监听环节有问题,回去检查DieWithError是否能正确触发报错(比如有没有遗漏错误检查)。

3. 排查端口占用问题

如果5000端口已经被其他程序占用,服务端虽能启动,但实际上没抢到端口监听。用上面的netstat命令查看,若有其他进程占用5000,换个端口(比如5001)重试,同时修改客户端的命令参数。

4. 确认客户端参数解析是否正确

你的客户端命令是./TCPEchoClientWS.exe 169.1.1.1 "Echo this" 5000,要确认代码里参数顺序是否匹配:

  • 第一个参数是服务器IP,第二个是发送消息,第三个是端口号。
    如果代码把端口当成第二个参数,客户端实际连接的是错误端口,必然返回10060超时错误。

5. 再次确认防火墙/安全软件拦截

虽然你关闭了Windows防火墙,但第三方安全软件(比如杀毒软件、管家类工具)自带的防火墙可能仍在拦截。可以暂时禁用这类软件,或者将你的可执行文件添加到信任列表。

按这个顺序排查,应该能快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:21:55