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

时间:2013-03-07 07:07:03

标签: linux sockets tcp recv getsockopt

我不熟悉Linux中的套接字,并尝试了解recv()的工作原理。试过一个我无法清楚地找到解释的场景。我希望那里的人可以启发我。这是场景:

使用TCP套接字在两个进程(发送者和接收者)之间发送5 MiB的数据。我在运行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);

我在接收之前使用getsockopt()函数调用来获取内部缓冲区SO_RCVBUF大小。它大概是86 KiB。

我想知道为获得5 MiB需要多少次recv()次调用以及每次recv()次呼叫需要多少字节。

收到5 MiB后,检查输出。它几乎需要48次recv()次调用才能获得5 MiB的数据。对于前40个呼叫,它接收的小于86 KiB,这是有意义的,因为接收的字节小于内部缓冲区。如果我收到了86 KiB的两倍,那么我遇到的一些解释是内核通常会分配SO_RCVBUF中显示的两倍。

但是我收到的字节多于86 KiB的两倍。

我可以使用SO_RCVBUF信任getsockopt()尺寸吗?

是否会动态更改其值?

尝试了同一场景的另一次迭代。 recv()电话的数量会有所不同。但我收到的字节有时不仅仅是分配的。

1 个答案:

答案 0 :(得分:1)

根据this thread,内核分配的缓冲区空间是SO_RCVBUF请求的两倍。