6

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

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

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

4

2 回答 2

0

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

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

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

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

于 2012-02-22T13:37:03.963 回答
0

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

于 2012-04-09T19:20:08.567 回答