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