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() 函数可以接收比其内部缓冲区更多的字节吗?的主要内容,如果未能解决你的问题,请参考以下文章