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

Posted

技术标签:

【中文标题】recv() 函数可以接收比其内部缓冲区更多的字节吗?【英文标题】:Can the recv() function receive more bytes than its internal buffer? 【发布时间】:2013-02-22 07:01:19 【问题描述】:

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

使用 TCP 套接字在两个进程(发送方和接收方)之间发送 5 MiB 的数据。我在运行 Linux 的 i.MX6 Sabrelite 板上执行这些过程。

发件人.cpp:

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

接收器.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 的两倍。

我可以使用getsockopt() 信任SO_RCVBUF 大小吗?

它会动态改变它的值吗?

刚刚尝试了相同场景的另一次迭代。 recv() 呼叫的数量各不相同。但我收到的字节数有时超过了分配。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我在另一个线程中看到了类似的解释。但我看到的是我接收的缓冲区超过了分配缓冲区的两倍 SO_RCVBUF 只是一个提示,实际分配的内存取决于网络统计,使用ss -tm 来检查它

以上是关于recv() 函数可以接收比其内部缓冲区更多的字节吗?的主要内容,如果未能解决你的问题,请参考以下文章

循环时 recv() 函数如何工作?

python粘包现象

linux 下socket的recv函数返回值问题

Table布局的优缺点

c语言如何检测网络是不是连接

recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?