4

当使用 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 中,在其他操作系统上似乎将其报告为我设置的值。谢谢你。

4

2 回答 2

8

摘自Linux 手册页的套接字

SO_SNDBUF

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

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

于 2014-11-11T06:08:25.107 回答
0

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

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

于 2014-01-15T20:28:18.523 回答