【问题标题】:C++: boost::asio : what's the maximum buffer size I can use for TCP sockets?C++: boost::asio : 我可以用于 TCP 套接字的最大缓冲区大小是多少?
【发布时间】:2026-01-24 14:15:01
【问题描述】:

在此SSL client example 中,默认缓冲区大小为 1K=1024 字节。我可以增加多少有任何实际限制吗?如果我将缓冲区设置为 100 MB 之类的,它会正常工作而不会出现不可预见的问题吗?

注意缓冲区不仅仅是保留的大小;它也传递给read()write()。由于大小限制,这些函数在多大时会面临问题?是否存在这样的限制?我可以想象,我可以write() 至少有一个明确的限制。

【问题讨论】:

  • 到无限,甚至更远。它被填满的可能性很小。一个好的缓冲区大小是 4096 字节。在不经常给操作系统发痒和不破坏 L1 缓存之间取得了很好的平衡。
  • 通常情况下,应用程序协议的特性有助于引导一个最佳保留缓冲区大小。另外请注意,示例的max_length 仅用于本地缓冲区保留和对应用程序协议(getline())实施限制。传递给读写操作的缓冲区大小是计算出来的请求长度,可能小于max_length
  • @TannerSansbury 感谢您提供信息!

标签: c++ boost buffer boost-asio


【解决方案1】:

除了int 的最大值之外没有其他限制,但是大于套接字接收缓冲区的读取缓冲区是没有意义的,因为永远无法使用超出的部分。

【讨论】:

  • 谢谢你的答案。您能否进一步告诉我,套接字缓冲区有多大?我在哪里可以得到那个号码?即使我将 100 MB 写入套接字,程序是否仍能正常工作而不会丢失数据?
  • @TheQuantumPhysicist 本地发送者和远程接收者的网络堆栈缓冲区的大小取决于实现,可能需要查阅实现文档。作为 TCP 协议处理的一部分,写入的数据不会丢失。 write() 将阻塞,直到本地网络堆栈的写入缓冲区中有可用空间。
  • @BryanO'Neil 没有要修复的语法错误。编辑被拒绝。
最近更新 更多