Mik*_*nce 6 cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket
我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.
当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.
是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).
我至少看到一个原因:当远程客户端不再从 TCP 连接的一侧读取数据时(使用 recv() 调用或其他方式)。
那么,场景是:客户端的接收TCP缓冲区已满。并且操作系统无法再接受来自其对等方的 TCP 数据包,因为它无法将它们存储在队列中。因此,当您的应用程序继续在套接字上发送 paquet 时,服务器端的发送 TCP 缓冲区也会变满!很快您的服务器将不再能够写入套接字,因为 send() 系统调用将: