recv()函数可以接收比其内部缓冲区更多的字节吗?



我是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请求的两倍。

相关内容

  • 没有找到相关文章

最新更新