当用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 中,在其他操作系统上似乎将其报告为我设置的值。谢谢。
套接字的 Linux 手册页摘录
SO_SNDBUF
设置或获取最大套接字发送缓冲区(以字节为单位)。内核 将此值加倍(以留出空间用于簿记开销) 使用 setsockopt(2) 设置,此双倍值由下式返回 Getsockopt(2).默认值由 /proc/sys/net/core/wmem_default 文件,允许的最大值为 由/proc/sys/net/core/wmem_max 文件设置。最小值(双倍) 此选项的值为 2048。
因此,内核将您为其内部目的设置的值加倍。
平台可以向上或向下调整您提供的值。请参见手册页。您低于平台最低要求。
2222太低了。它应该更像 32k。