为什么EventMachine出站数据缓冲区可能会停止发送并且只是永远填满(而其他连接仍然可以发送)

Mik*_*nce 6 cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket

我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.

当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.

是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).

yve*_*mes 0

我至少看到一个原因:当远程客户端不再从 TCP 连接的一侧读取数据时(使用 recv() 调用或其他方式)。

那么,场景是:客户端的接收TCP缓冲区已满。并且操作系统无法再接受来自其对等方的 TCP 数据包,因为它无法将它们存储在队列中。因此,当您的应用程序继续在套接字上发送 paquet 时,服务器端的发送 TCP 缓冲区也会变满!很快您的服务器将不再能够写入套接字,因为 send() 系统调用将:

  1. 不确定地阻止。(等待缓冲区足够空以容纳新的 paquet)
  2. ot 返回并显示 EWOULDBLOCK 错误。(如果您将套接字配置为非阻塞套接字)

当我在客户端的代码中放置断点时,我通常会在测试环境中遇到这种用例。