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