리눅스에서 소켓을 처음 사용하고 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()
전화 번호는 다양합니다. 그러나 내가받는 바이트는 때때로 할당 된 것보다 많습니다.
다른 스레드에서 비슷한 설명을 보았습니다. 하지만 내가 알기로는 할당 된 버퍼의 두 배 이상을 recv하는 것입니다. – vels
아마도 반올림합니다. – Barmar
'SO_RCVBUF'는 단지 힌트 일뿐입니다. 할당 된 실제 메모리는 네트워크 통계에 의존합니다.'ss -tm'을 사용하여 확인합니다 –