2014-01-15 60 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