c++ - 如何应对高频数据?

标签 c++ winsock

我有一个 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/

相关文章:

c++ - 分层常量集

c++ - NPAPI mac 插件与浏览器共享命令

c++ - 在 Qt for Web Assembly 上访问本地用户文件

c++ - 无法使用 vector::插入 "no instance of overloaded function..."

Python 原始套接字 (Windows) : Sniffing Ethernet Frames

c++ - 在 C++ 中通过 UDP 发送缓冲图像

c++ - opencv轮廓区域返回零

使用 GetQueuedCompletionStatus 和 ERROR_MORE_DATA 的套接字

c++ - 在 DLL 中捕获未处理的异常

使用 winsock 和 std::thread 的 C++ 多线程服务器