2013-03-07 4 views
0

리눅스에서 소켓을 처음 사용하고 recv()의 작동 방식을 이해하려고합니다. 설명을 명확하게 찾을 수없는 시나리오를 시도했습니다. 누군가가 저를 계몽 할 수 있기를 바랍니다. 시나리오는 다음과 같습니다.recv() 함수는 내부 버퍼보다 ​​많은 바이트를받을 수 있습니까?

TCP 소켓을 사용하여 두 프로세스 (보낸 사람 및받는 사람)간에 5MB의 데이터를 보냅니다. 이 프로세스는 Linux를 실행하는 i.MX6 Sabrelite 보드에서 실행됩니다.

Sender.cpp :

char buffer[5MB]; 
send(sendSocket, (void*) buffer, 5 MiB, 0); 

Receiver.cpp는 :

char buffer[5 MiB]; 
int count = 0; 
do { 
    rbytes = recv(receiveSocket, (void*) buffer, 5MB, 0); 
    printf("Recv'd %d. %d\n",count,rbytes); 
    count++; 
} while (rbytes!=0); 

I는 내부 버퍼 SO_RCVBUF 크기를 얻기 위해 수신 전에 getsockopt() 함수 호출을 사용했다. 그것은 대략 86 KiB이었다.

나는 recv() 콜이 5 MiB를 얻기 위해 얼마나 많은 호출을하고 얼마나 많은 바이트가 각각 recv() 콜에 대해보고 싶었습니다.

5 MiB 수신 후 출력을 확인합니다. 그것은 거의 48 recv() 콜을 사용하여 5 MiB의 데이터를 얻습니다. 처음 40 회의 통화의 경우 수신 된 바이트가 내부 버퍼보다 ​​작 으면 86 KiB 미만을 수신했습니다. 내가 86 KiB의 두 배를 받았다면 나는 커널이 일반적으로 SO_RCVBUF에 표시된 것의 두 배를 할당한다는 것을 설명했다.

그러나 나는 86 KiB의 두 배보다 많은 바이트를 받고 있습니다.

getsockopt()을 사용하여 SO_RCVBUF 크기를 신뢰할 수 있습니까?

동적으로 값을 변경합니까?

같은 시나리오의 또 다른 반복을 시도했습니다. recv() 전화 번호는 다양합니다. 그러나 내가받는 바이트는 때때로 할당 된 것보다 많습니다.

답변

1

this thread에 따르면 커널은 SO_RCVBUF로 요청한 것보다 두 배 많은 버퍼 공간을 할당합니다.

+0

다른 스레드에서 비슷한 설명을 보았습니다. 하지만 내가 알기로는 할당 된 버퍼의 두 배 이상을 recv하는 것입니다. – vels

+0

아마도 반올림합니다. – Barmar

+0

'SO_RCVBUF'는 단지 힌트 일뿐입니다. 할당 된 실제 메모리는 네트워크 통계에 의존합니다.'ss -tm'을 사용하여 확인합니다 –