我重拍这篇文章,因为我的标题select是可怕的,对此感到遗憾。 我的新post可以在这里find: 发送很多后,我的send()调用导致我的程序完全停顿。 这怎么可能?
非常感谢大家。 问题是,客户实际上是机器人,他们从来没有从连接读取。 (感觉愚蠢)
TCP_NODELAY
可能有助于从发送者到接收者的小数据包延迟,但是您给出的描述指向不同的方向。 我可以想象如下:
SO_SNDBUF
),并导致服务器进程在send(2)
系统调用中出现“卡住”。 此时内核等待另一端确认一些未完成的数据,但是接收端并不期望它,所以它不会收到recv(2)
。 有可能还有其他的解释,但很难说没有看到代码。
如果send()
在TCP套接字上被阻塞,则表示发送缓冲区已满,这又意味着连接另一端的对等体不够快地读取数据。 也许这个客户端完全被卡住,而不是经常调用recv()
。
Nagle不会导致“消失在内核”,这就是为什么禁用它不会帮助你。 Nagle只会暂时缓冲数据,但最终会在没有用户提示的情况下发送数据。
还有一些其他的罪魁祸首。
编辑更新的问题。
您必须确保客户端正在接收所有已发送的数据,并且正在快速接收数据。 让每个客户写入日志或进行验证。
例如,如果客户端正在等待服务器接受其23个字节的更新,则可能不会接收数据。 这可能会导致服务器的发送缓冲区填满,这将导致降级和最终的死锁。
如果这确实是罪魁祸首,解决方案将是一些异步通信,如Boost的Asio库。