【问题标题】:Why might an EventMachine outbound data buffer stop sending and just fill up forever (while other connections can still send)为什么 EventMachine 出站数据缓冲区可能会停止发送并永远填满(而其他连接仍然可以发送)
【发布时间】:2012-02-09 18:54:27
【问题描述】:

我有一个 EventMachine 服务器将 TCP 数据向下发送到 Mac 客户端(通过 GCDAsyncSocket)。它总是在一段时间内完美无缺,但不可避免地服务器会突然停止逐个连接地发送数据。连接仍然保持,服务器仍然从客户端接收数据,但它并没有走反方向。

当这种情况发生时,我通过 connection#get_outbound_data_size 发现连接发送缓冲区被无限填满(通过 #send_data)并且没有被发送到客户端。

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

【问题讨论】:

    标签: cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你是对的,客户端停止调用它的“阅读更多”方法......尽管根本原因有点模糊。我在 cocoaasyncsocket 论坛上发帖,如果有人在那里有更多信息,我会放一个链接。感谢您的回答!
    【解决方案2】:

    在 3 月 23 日有一个patch 应用于 GCDAsyncSocket,以防止读取停止。这个补丁解决了你的问题吗?

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2021-02-02
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多