没有缓冲区空间向套接字发送数据时可用

时间:2012-03-07 10:26:04

标签: c# sockets networking network-protocols

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

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

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

这个错误究竟是什么意思?套接字connectionSocket的内部OS缓冲区已满?有什么方法可以使它发挥作用。作为出现的上下文在http代理服务器中。这可能表明我想,数据来自原始服务器的速率高于我的服务器可以使用代理客户端处理的速率。你会怎么处理它?<​​/ p>

我正在使用tcp。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

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

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