Rust开发多线程长连接TCP服务器时TcpListener阻塞无法接入新连接怎么办
问题原因及修复方案
代码层面核心问题
你代码中给TcpListener设置了非阻塞模式是触发连接数限制的主要原因:
TcpListener调用set_nonblocking(true)后,incoming()迭代器在没有新连接接入时会返回WouldBlock类型的IO错误,而该迭代器遇到任意错误都会直接终止遍历,导致你的监听循环直接退出,无法继续接受新连接。- 你测试时刚好前2个连接在迭代器终止前完成了接入,后续的连接自然无法被处理,直到进程重启才会重新监听,就出现了最多同时接2个连接的现象。
修复方案
最简单的适配方案是直接删除tcp_listener.set_nonblocking(true);这行代码:
默认阻塞模式下,incoming()迭代器会在没有新连接时一直阻塞等待,遇到新连接才会返回,完全适配你每个连接开独立线程处理的需求,也不会出现迭代器意外退出的问题。
额外注意点
- 你给
TcpStream也设置了非阻塞模式,但后续直接调用write方法没有做错误处理:非阻塞模式下如果套接字写缓冲区已满,write会直接返回错误,导致写入失败,实际使用时建议要么去掉TcpStream的非阻塞配置,要么自行处理WouldBlock等非致命错误。 - 你提到的Windows环境下服务器连接方式异常也是可能的诱因之一:Windows平台默认的TCP半连接队列限制、测试客户端的并发连接限制都可能导致类似现象,修改代码后可以配合网络配置排查进一步验证。
内容的提问来源于stack exchange,提问作者Alberto Segura
相关产品推荐
相关产品推荐

