gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:31:47 24 4
gpt4 key购买 nike

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

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

是否有特定的(并且希望可以修复的)原因导致这种情况发生? react 堆一直在嗡嗡作响,与服务器的其他事件连接继续正常工作(尽管它们有时也会陷入缓冲区 hell )。

最佳答案

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

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

  1. 不确定地阻止。 (等待缓冲区为新的 paquet 清空)
  2. ot 返回一个 EWOULDBLOCK 错误。 (如果您将套接字配置为非阻塞套接字)

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

关于cocoa - 为什么 EventMachine 出站数据缓冲区可能会停止发送并永远填满(而其他连接仍可以发送),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9216973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com