当用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中,在其他操作系统上似乎将其报告为我设置的值。 谢谢。
答案 0 :(得分:7)
摘自Linux man page for socket
<强> SO_SNDBUF 强>
以字节为单位设置或获取最大套接字发送缓冲区。内核 何时将该值加倍(以便为记账开销提供空间) 使用setsockopt(2)设置,并返回此doubled值 的getsockopt(2)。默认值由。设置 / proc / sys / net / core / wmem_default文件和允许的最大值是 由/ proc / sys / net / core / wmem_max文件设置。最小(加倍) 此选项的值为2048。
因此,内核将您为其内部目的设置的值加倍。
答案 1 :(得分:0)
平台可以调整您向上或向下提供的值。请参见手册页。你低于最低平台。
2222太低了。它应该更像是32k。