做一组后getsockopt SO_RECVBUF在linux中显示两倍的值?

Posted

技术标签:

【中文标题】做一组后getsockopt SO_RECVBUF在linux中显示两倍的值?【英文标题】:getsockopt SO_RECVBUF after doing a set shows double the value in linux? 【发布时间】:2014-02-04 11:37:58 【问题描述】:

当使用 SO_RECVBUF 调用 setsockopt,然后转身使用 SO_RECVBUF 调用 getsockopt 时,它似乎告诉我它将缓冲区大小设置为我请求设置的两倍。有人知道为什么会这样吗?

有问题的代码:

https://gist.github.com/rdp/8443238

输出:

setting it as 2222
[udp @ 0x1a72ec0] end receive buffer size reported is 4444

仅在 linux 中,在其他操作系统上似乎将其报告为我设置的值。 谢谢。

【问题讨论】:

Understanding set/getsockopt SO_SNDBUF的可能重复 【参考方案1】:

平台可以向上或向下调整您提供的值。请参阅手册页。您低于平台最小值。

2222 太低了。它应该更像是 32k。

【讨论】:

如果我将其设置为 32K,它会将其报告为 64K。如果将其设置为 64K,则将其报告为 128K...所以我认为可能不是这里的值太低...谢谢! 所以无论你设置什么,它都会加倍。平台可以向上或向下调整您提供的值。请参阅“手册”页面。 是的,所以我的问题仍然是“为什么”Linux 会加倍它,而其他操作系统却没有。基本上,它倾向于将请求的值加倍的原因是什么。【参考方案2】:

摘自Linux man page for socket

SO_SNDBUF

设置或获取最大套接字发送缓冲区(以字节为单位)。内核 将这个值加倍(为簿记开销留出空间),当它 使用 setsockopt(2) 设置,并且这个翻倍的值由 getockopt(2)。默认值由 /proc/sys/net/core/wmem_default 文件,最大允许值为 由 /proc/sys/net/core/wmem_max 文件设置。最低(加倍) 此选项的值为 2048。

因此,内核将您为其内部目的设置的值加倍。

【讨论】:

以上是关于做一组后getsockopt SO_RECVBUF在linux中显示两倍的值?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何用getsockopt知道“序列号”?

linux下getsockopt和setsockopt详解及测试

getsockopt 返回负 mss(在 CLion 上)

为啥getsockopt optlen 为零?

遇到的错误是: dial tcp [::1]:3000: getsockopt: connection denied