我是 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 的两倍。
我可以相信SO_RCVBUF
使用的尺寸getsockopt()
吗?
它会动态改变它的值吗?
刚刚尝试了相同场景的另一个迭代。通话次数recv()
不同。但是我收到的字节有时超过了分配。