2014-01-15 4 views
3

, SO_RECVBUF와 setsockopt를 호출 한 후 SO_RECVBUF와 getsockopt 함수를 턴어라운드 및 호출, 그것은 내가 그것을로 설정 요청에 두 번 어떤 버퍼 크기를 설정하는 것을 말해 것으로 보인다. 그게 왜 일어날 지 아무도 몰라요? 문제getsockopt SO_RECVBUF를 한 후 linux의 값을 두 배로 보여줍니까?

코드 :

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

출력 :

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

만 리눅스에 다른 OS에서의 내가 그것을가 설정 한 값으로보고 할 것 같다. 감사합니다.

+0

[이해/getsockopt 이해 SO \ _SNDBUF] (https://stackoverflow.com/questions/2031109/understanding-set-getsockopt-so-sndbuf) – rogerdpack

답변

5

소켓

SO_SNDBUF

설정에 대한 Linux man page에서 발췌 또는 바이트의 최대 소켓 전송 버퍼를 가져옵니다. 그 가 (2) setsockopt를 사용하여 설정 될 때 커널 복식이 값 (부기 오버를위한 공간을 허용하기 위해),이 값은 getsockopt 함수에 의해 리턴되는 배 (2). 기본값은 은/proc/sys 인/인터넷/코어/wmem_default 파일로 설정하고 최대 허용 값은/proc 디렉토리/sys 인/인터넷/코어/wmem_max 파일에 의해 설정 입니다. 이 옵션의 최소 (배가 된) 값은 2048입니다.

따라서 커널은 내부 용으로 설정 한 값을 두 배로 늘립니다.

0

플랫폼은 당신이 아래로 공급하거나 값을 조정할 수 있습니다. 매뉴얼 페이지를 참조하십시오. 플랫폼 최소값보다 낮았습니다.

2222

이 너무 낮습니다. 32k와 비슷해야합니다.

+0

의 가능한 복제본 32K로 설정하면 64K. 64K로 설정하면 128K로보고합니다 ... 그래서 여기 값이 너무 낮지 않을 수도 있습니다 ... 감사합니다! – rogerdpack

+0

그래서 당신이 설정 한 것은 배가됩니다. 플랫폼은 사용자가 제공하는 값을 조정할 수 있습니다. '남자'페이지를보십시오. – EJP

+0

예, 그래서 제 질문은 여전히 ​​남아있다가 "왜"다른 운영 체제의 그렇지 않은 경우 리눅스는 그것을 두 배로. 기본적으로 요청 된 가치를 두 배로 늘리는 것을 선호하는 이유는 무엇입니까? – rogerdpack