gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:11 27 4
gpt4 key购买 nike

我是 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。

我想看看需要多少次 recv() 调用才能获得 5 MiB,以及每次 recv() 调用需要多少字节。

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

但我收到的字节数超过了 86 KiB 的两倍。

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

它会动态改变它的值吗?

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

最佳答案

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

关于linux - recv() 函数可以接收比其内部缓冲区更多的字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com