Linux recv()函数能否接收比其内部缓冲区更多的字节?
我不熟悉Linux中的套接字,并试图了解Linux recv()函数能否接收比其内部缓冲区更多的字节?,linux,sockets,tcp,recv,getsockopt,Linux,Sockets,Tcp,Recv,Getsockopt,我不熟悉Linux中的套接字,并试图了解recv()的工作原理。尝试了一个我找不到清晰解释的场景。我希望有人能启发我。以下是场景: 使用TCP套接字在两个进程(发送方和接收方)之间发送5 MiB的数据。我在运行Linux的I.MX6 Sabreite板上执行这些过程 Sender.cpp: char buffer[5MB]; send(sendSocket, (void*) buffer, 5 MiB, 0); Receiver.cpp: char buffer[5 MiB]; int cou
recv()
的工作原理。尝试了一个我找不到清晰解释的场景。我希望有人能启发我。以下是场景:
使用TCP套接字在两个进程(发送方和接收方)之间发送5 MiB的数据。我在运行Linux的I.MX6 Sabreite板上执行这些过程
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千磅
我想知道获得5个MiB需要多少个recv()
调用,以及每个recv()
调用需要多少字节
收到5个MiB后,我检查输出。几乎需要48次recv()
调用才能获得5个MiB的数据。对于前40个调用,它接收到的字节数小于内部缓冲区,因此小于86 KiB。如果我收到了86kib的两倍,那么我遇到的一些解释是,内核通常分配两倍于中显示的内容
但我收到的字节比86kib的两倍还要多
我可以使用getsockopt()
信任SO\RCVBUF
大小吗
它是否动态更改其值
只是尝试了相同场景的另一次迭代。recv()
调用的数量不同。但是我收到的字节有时超过了分配的字节数。根据,内核分配的缓冲区空间是使用SO_RCVBUF请求的两倍。我在另一个线程中看到了类似的解释。但我看到的是,我接收的缓冲区超过了分配缓冲区的两倍,因此_RCVBUF
只是一个提示,实际分配的内存取决于网络统计数据,请使用ss-tm
进行检查