我有一个C++应用程序,它接收库存数据并通过套接字(充当服务器)转发到另一个应用程序.
实际上,该WSASend
函数在小秒后返回错误代码10055,我发现这是错误消息
"没有可用的缓冲区空间.无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或因为队列已满".
只有当我在市场营业时间之后运行应用程序时才会出现问题,因为我们在几分钟内收到全天数据(大约130 MB)(我认为这是相对较大的)我正在进行稳健性测试.
我尝试使用setsockopt
函数增加发送缓冲区SO_SNDBUF,但仍存在同样的问题.我怎么解决这个问题?这与接收缓冲区有关吗?
发送详情:
对于每个完整的消息,我调用使用重叠套接字的send方法
编辑:有人可以提供一般指导来处理C++中的高频数据吗?
如果接收器没有足够快地处理它们的套接字结束,TCP的流控制将导致内部发送缓冲区填满.从错误消息看,您正在发送数据而不考虑Winsock堆栈可以多快地处理它.如果您可以准确说明发送数据的方式,将会有所帮助?您是在等待所有数据到达然后发送一个大块,还是零碎地发送?
您是通过非阻塞或重叠套接字发送的吗?在任何一种情况下,在每次发送之后你应该等待一个通知,告知套接字处于可以发送更多数据的状态,因为select()/ WaitForMultipleObjects()表明它可以(对于非阻塞套接字),或者重叠的I/O完成,表示数据已成功复制到套接字内部发送缓冲区.
您可以重叠发送,即一次排队多个缓冲区 - 这就是重叠I/O的用途 - 但您需要仔细考虑锁定大量页面的内存含义并可能耗尽非页面缓冲池.