将数据发送到套接字时没有可用的缓冲空间

本文关键字:空间 缓冲 数据 套接字 | 更新日期: 2023-09-27 18:26:57

我在服务器上连接的套接字上使用这样的东西来向客户端发送数据:

IAsyncResult asyncRes = connectionSocket.BeginSend(data, 0, length, SocketFlags.None, 
     out error, new AsyncCallback(SendDataDone), signalWhenDataSent);

看起来,当服务器和客户端之间的互联网连接缓慢时,我会收到这样的异常描述:NoBufferSpaceAvailable

这个错误到底意味着什么?套接字connectionSocket的内部操作系统缓冲区已满?有什么方法可以让它发挥作用。作为一个出现在http代理服务器中的上下文。这可能表明,我想,数据来自原始服务器的速率高于我的服务器可以使用代理客户端处理的速率。你会怎么处理?

我正在使用tcp。

将数据发送到套接字时没有可用的缓冲空间

解决此问题的方法是将从一个套接字读取的方式与向另一个套接字写入的速度关联起来,因为如果不进行缓冲,则无法以高于连接在该端的客户端读取速度的速度向套接字写入。

如果使用同步套接字,问题就不会出现,因为只要操作仍处于挂起状态,它们就会阻塞,但异步调用就不是这样。

确切地说,保存传出数据的内核套接字缓冲区很可能已满。你的发送速度对客户来说太快了。您可以尝试增加发送缓冲区大小,但这并不能保证您不会再次遇到此问题。

简单的答案是,您应该做好发送操作可能失败的准备,然后重试。在应用程序中保持不断增长的缓冲区也不理想,但如果停止接收(取决于TCP窗口大小和接收缓冲区大小),原始服务器也应该放慢速度。