如何动态知道 TCP 缓冲区大小

Posted

技术标签:

【中文标题】如何动态知道 TCP 缓冲区大小【英文标题】:how to know the TCP buffer size dynamically 【发布时间】:2011-08-30 06:56:58 【问题描述】:

是否可以在 windows 上动态知道 TCP 缓冲区大小。我使用 SO_SNDBUF、SO_RECVBUF 设置 TCP 缓冲区大小,也可以使用 getsockopt() 检查其分配的缓冲区大小。但我想知道如何获得可用的缓冲区大小,以便如果缓冲区大小超出我可以采取一些行动。任何实用程序或 api 都将同样有用。 我的问题是针对 windows 的。尽管有人知道任何关于 linux 的知识,但知道任何并行对我来说也是有用的。

【问题讨论】:

实际上我在运行大约 17020 小时后收到套接字错误 10055。这个错误意味着 Windows 没有足够的内存。我只是想如果我知道我的 TCP 套接字的缓冲区容量我将断开它或稍后将其清理。有关此问题,您可以参考我的帖子***.com/questions/6367872/… 你创建了多少个连接? @Eugene Homyakov,只有一个套接字连接。但这个连接被大量(大约 5-7 Mbps 数据交换)用于传输文本数据。 我认为传输数据不会触发此错误。您更有可能泄漏套接字,即忘记调用closesocket @Eugene Homyakov,即使我也是这样想的。我交叉检查了我的代码是否相同,但事实并非如此。即使在我测试连接的 20 小时内,我也看到了这一点几乎只有 1-2 次断开连接。我还使用“TCPView”(与 netstat 命令非常平行)来检查相同的情况(在启动应用程序后立即进行检查,然后间歇性地检查它)。它没有向我显示任何增加的数字。一段时间内的连接数。所以我只希望这是别的东西。 【参考方案1】:

内核异步使用缓冲区。你无法控制它们。此外,底层实现可以忽略您的 SO_SNDBUF/SO_RECVBUF 请求,或者选择提供比请求更小/更大的数量。

【讨论】:

以上是关于如何动态知道 TCP 缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

winsocket udp和tcp编程,缓冲区应该设置多大?

TCP缓冲区大小及限制

c程序计算默认缓冲区的大小

如何找到linux的套接字缓冲区大小

socket tcp缓冲区大小的默认值最大值

Indy,如何知道所需缓冲区的大小?