1

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

int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen); 

我实际上想知道这个函数从哪里检索数据,因为在我的应用程序中,我收到不同的数据包,一旦我确定我收到了所有数据包,我就会使用循环来检索几个数据包。

它似乎有效(也许我很幸运;)但我真的不明白我的数据包之前存储在哪里,以便在我的循环中通过多次调用 recvfrom 来检索。

提前感谢您的帮助,祝您有美好的一天!亚历克斯

4

2 回答 2

4

它们保存在内核中的某个内部缓冲区中。如果缓冲区填满(即如果您的应用程序停止调用recvfrom),内核将开始丢弃数据报。

重要的是要意识到两者sendtorecvfrom只是花哨memcpy的呼叫-它们实际上都没有“发送”或“接收”任何东西。Sendto 将数据复制到内核,然后内核尝试将其实际放入数据包中,依此类推。同样,在您调用recvfrom时,数据已经被接收,并且recvfrom将其复制到您的用户空间缓冲区

于 2012-11-20T04:17:30.213 回答
0

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

于 2012-11-20T05:52:59.950 回答