如何应对高频数据?

时间:2009-02-28 09:18:43

标签: c++ winsock

我有一个C ++应用程序,它接收股票数据并通过套接字转发到另一个应用程序(充当服务器)。

实际上WSASend函数在小秒后返回错误代码10055,我发现这是错误消息

“没有可用的缓冲区空间。无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或因为队列已满”。

只有当我在市场营业时间之后运行应用程序时才出现问题,因为我们在几分钟内收到全天数据(大约130 MB)(我认为这是相对较大的) 我这样做是为了进行稳健性测试。

我尝试使用setsockopt函数增加发送缓冲区SO_SNDBUF但仍存在同样的问题。 我怎么解决这个问题?这与接收缓冲区有关吗?

发送详情:

对于每个完整的消息,我调用使用重叠套接字的send方法

编辑: 有人可以提供一般指导来处理C ++中的高频数据吗?

2 个答案:

答案 0 :(得分:6)

如果接收器没有足够快地处理它们的套接字结束,TCP的流量控制将导致内部发送缓冲区填满。从错误消息看,您正在发送数据而不考虑Winsock堆栈可以多快地处理它。如果您可以准确说明发送数据的方式,将会有所帮助?您是在等待所有数据到达然后发送一个大块,还是零碎地发送?

您是通过非阻塞或重叠套接字发送的吗?在任何一种情况下,在每次发送之后你应该等待一个通知,告知套接字处于可以发送更多数据的状态,因为select()/ WaitForMultipleObjects()表示它可以(对于非阻塞套接字),或者重叠的I / O完成,表示数据已成功复制到套接字内部发送缓冲区。

你可以重叠发送,即一次排队多个缓冲区 - 这就是重叠I / O的含义 - 但你需要仔细考虑锁定大量页面的内存含义并可能耗尽非分页池。

答案 1 :(得分:0)

尼克的回答几乎击中了头上的钉子;您最有可能通过立即启动太多重叠发送来耗尽“锁定页面限制”。理想情况下,您需要在自己的内存缓冲区中缓冲数据,并且在任何时候只有一定数量的重叠发送待处理。我在这里谈谈我的IOCP框架如何处理这种情况http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.html以及相关的TCP接收窗口流控制问题http://www.lenholgate.com/blog/2008/06/data-distribution-servers.htmlhttp://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.html

我的首选解决方案是在任何时候允许可配置数量的待处理重叠发送,并且一旦超过此限制,就开始缓冲数据,然后使用待处理重叠发送的完成来驱动发送缓冲数据。这允许您严格控制非页面缓冲池的数量和使用的“锁定页面”的数量,并且可以尽可能快地发送大量连接,但仍然可以控制它们使用的资源。