linuxudpsetsockoptgetsockopt

getsockopt SO_RECVBUF after doing a set shows double the value in linux?


When calling setsockopt with SO_RECVBUF, then turning around and calling getsockopt with SO_RECVBUF, it appears to be telling me that it sets the buffer size to twice what I requested it to be set to. Anybody know why that may be?

code in question:

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

output:

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

Only in linux, on other OS's seem to report it as the value I set it to. Thank you.


Solution

  • Excerpt from Linux man page for socket

    SO_SNDBUF

    Sets or gets the maximum socket send buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set using setsockopt(2), and this doubled value is returned by getsockopt(2). The default value is set by the /proc/sys/net/core/wmem_default file and the maximum allowed value is set by the /proc/sys/net/core/wmem_max file. The minimum (doubled) value for this option is 2048.

    So, kernel doubles the value you set for it's internal purpose.