2014-01-15 61 views
3

当用SO_RECVBUF调用setsockopt,然后转身用SO_RECVBUF调用getsockopt时,它似乎告诉我它将缓冲区大小设置为我要求设置的两倍。有人知道为什么这可能是?getsockopt SO_RECVBUF做了一个set后,在linux中显示了两倍的值?

代码问题:

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

输出:

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

只有在linux下,对其他操作系统的似乎其报告为我设置的值。 谢谢。

+0

可能重复[Understanding set/getsockopt SO \ _SNDBUF](https://stackoverflow.com/questions/2031109/understanding-set-getsockopt-so-sndbuf) – rogerdpack

回答

5

节选插座

SO_SNDBUF

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

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

0

该平台可以调整您向上或向下提供的值。查看手册页。你低于平台最低限度。

2222太低。它应该更像32k。从Linux man page

+0

如果将其设置为32K,则会将其报告为64K。如果它设置为64K,它会将其报告为128K ...因此,我认为这可能不是该值太低......谢谢! – rogerdpack

+0

因此,无论你设定的是什么,它都会加倍。该平台可以调整您提供的价值。看到'男人'页面。 – EJP

+0

是的,所以当其他操作系统不支持时,我的问题仍然是“为什么”Linux将其加倍。基本上,它背后的理由是什么,宁愿将请求价值翻倍。 – rogerdpack