在做一个set后,getsockopt SO_RECVBUF在linux中显示了两倍的值?

时间:2014-01-15 19:55:11

标签: linux udp setsockopt getsockopt

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

2 个答案:

答案 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。