我不熟悉Linux中的套接字,并尝试了解recv()
的工作原理。试过一个我无法清楚地找到解释的场景。我希望那里的人可以启发我。这是场景:
使用TCP套接字在两个进程(发送者和接收者)之间发送5 MiB的数据。我在运行Linux的i.MX6 Sabrelite板上执行这些过程。
Sender.cpp:
char buffer[5MB];
send(sendSocket, (void*) buffer, 5 MiB, 0);
Receiver.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()
电话的数量会有所不同。但我收到的字节有时不仅仅是分配的。