0

我是 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()不同。但是我收到的字节有时超过了分配。

4

1 回答 1

1

根据这个线程,内核分配的缓冲区空间是您使用 SO_RCVBUF 请求的两倍。

于 2013-03-07T07:18:10.980 回答