C UDP套接字,在recvfrom检索数据包之前,数据包存储在哪里?
我正在使用UDP套接字在C中创建一个小应用程序,并使用以下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
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.