Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux recv()函数能否接收比其内部缓冲区更多的字节?_Linux_Sockets_Tcp_Recv_Getsockopt - Fatal编程技术网

Linux recv()函数能否接收比其内部缓冲区更多的字节?

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

我不熟悉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 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
进行检查