我是Linux中的套接字新手,并试图了解recv()
是如何工作的。试了一个我找不到解释的场景。我希望有人能开导我。场景如下:
使用TCP Sockets在两个进程(Sender和Receiver)之间发送5mib的数据。我在运行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. %dn",count,rbytes);
count++;
} while (rbytes!=0);
我在接收之前使用getsockopt()
函数调用来获得内部缓冲区SO_RCVBUF
大小。大约是86千字节。
我想看看需要多少recv()
调用才能获得5 MiB,以及每个recv()
调用需要多少字节。
收到5mib后检查输出。它几乎需要48次recv()
调用才能获得5 MiB的数据。对于前40个调用,它接收到的字节数少于86 KiB,这是有意义的,因为接收到的字节数小于内部缓冲区。如果我收到了86kib的两倍,那么我遇到的一些解释是内核通常分配的是SO_RCVBUF
中显示的两倍。
但是我收到的字节数比86kib的两倍还多。
我可以信任SO_RCVBUF
的大小使用getsockopt()
吗?
它动态地改变它的值吗?
只是尝试了相同场景的另一个迭代。recv()
呼叫次数变化。但是我接收到的字节数有时比分配的要多。
根据这个线程,内核分配的缓冲区空间是您使用SO_RCVBUF请求的两倍。