首页 > 解决方案 > Winsock2:重叠 IO 的发送缓冲区大小的影响

问题描述

我一直在修补一个开源项目,该项目已开始使用异步重叠 IO 在其最新版本之一中使用 Winsock2 接口发送数据。在项目过去,提高(旧)阻塞/同步IO 发送性能的一种方法是将发送缓冲区大小(SO_SNDBUF)增加到要发送的数据包的大小(使用 send() 函数)。随着重叠 IO 的引入(使用 WSASend() 函数),这对我来说感觉不太明智。我阅读了文档并认为将 SO_SNDBUF 设置为 0 实际上可能有助于节省一些资源,但我最终只是减慢了发送过程。

现在,尽管进行了一些研究,但我找不到任何关于 WSASend() 和重叠非阻塞 IO 实际处理内部套接字缓冲区的描述。它是否会每隔一段时间使用提供的 WSABUF 结构数组并将尽可能多的数据推送到内部发送缓冲区(即多个 WSABUF,其中一些可能会拆分)?还是一次只尝试将一个 WSABUF 推入缓冲区(如果内部缓冲区太小,则拆分 WSABUF)?

从那里开始:将 SO_SNDBUF 增加到使用异步重叠 IO 时可以预期的最大 WSABUF 的大小有多合理?这显然会增加应用程序的内存利用率,但我认为这暂时不会成为问题,因为我只会打开几十个套接字并增加 SO_SNDBUF 并且我们谈论的是原始大小的三倍。

感谢您的输入!

标签: c++windowsbufferwinsock2overlapped-io

解决方案


推荐阅读