Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
C UDP套接字,在recvfrom检索数据包之前,数据包存储在哪里?_C_Sockets_Udp_Storage - Fatal编程技术网

C UDP套接字,在recvfrom检索数据包之前,数据包存储在哪里?

C UDP套接字,在recvfrom检索数据包之前,数据包存储在哪里?,c,sockets,udp,storage,C,Sockets,Udp,Storage,我正在使用UDP套接字在C中创建一个小应用程序,并使用以下recvfrom函数: int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen); 实际上,我想知道这个函数从何处检索数据,因为在我的应用程序中,我收到不同的数据包,一旦我确定我收到了所有的数据包,我就使用一个循环来检索几个数据包 这似乎有效,也许我很幸运;但是,在我的循环中多次调用recv

我正在使用UDP套接字在C中创建一个小应用程序,并使用以下recvfrom函数:

int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen); 
实际上,我想知道这个函数从何处检索数据,因为在我的应用程序中,我收到不同的数据包,一旦我确定我收到了所有的数据包,我就使用一个循环来检索几个数据包

这似乎有效,也许我很幸运;但是,在我的循环中多次调用recvfrom来检索数据包之前,我真的不知道数据包存储在哪里

提前感谢您的帮助,祝您度过愉快的一天!
Alex

它们被保存在内核中的某个内部缓冲区中。如果缓冲区填满,即如果应用程序停止从内核调用recvfrom,那么内核将开始删除数据报


重要的是要认识到sendto和recvfrom都是类似于memcpy的奇特调用——它们实际上都没有发送或接收任何东西。Sendto将数据复制到内核,然后内核尝试将其放入数据包中,以此类推。类似地,当您调用recvfrom时,数据已经被接收,recvfrom只将其复制到您的用户空间缓冲区。

它们保存在内核中的某个内部缓冲区中。如果缓冲区填满,即如果应用程序停止从内核调用recvfrom,那么内核将开始删除数据报


重要的是要认识到sendto和recvfrom都是类似于memcpy的奇特调用——它们实际上都没有发送或接收任何东西。Sendto将数据复制到内核,然后内核尝试将其放入数据包中,以此类推。类似地,当您调用recvfrom时,数据已经被接收,recvfrom只将其复制到您的用户空间缓冲区。

所有接收到的数据包都存储在内核队列中。这是一个固定长度的队列。如果应用程序没有收到数据包,它将覆盖旧数据包,并更新其队列。所以,无论何时从旧数据包调用receivefrom,都会将可用数据包传递给您。

所有接收到的数据包都存储在内核队列中。这是一个固定长度的队列。如果应用程序没有收到数据包,它将覆盖旧数据包,并更新其队列。因此,无论何时您致电receivefrom,都会收到可用的旧数据包。

非常感谢您的明确回答!我现在明白我在做什么了非常感谢你给我一个清晰的答案!我现在明白我所做的是完全错误的。它不是一个固定长度的队列,而是一个可变大小的缓冲区,其大小可以由应用程序控制。如果缓冲区已满,则丢弃后续数据报:它们不会覆盖。最后一句与前面的两句相矛盾-1完全不正确。它不是一个固定长度的队列,而是一个可变大小的缓冲区,其大小可以由应用程序控制。如果缓冲区已满,则丢弃后续数据报:它们不会覆盖。最后一句与前面的两句相矛盾-1.