UDP:每隔x秒从客户端读取一帧新帧

时间:2018-04-26 09:33:12

标签: c linux udp

我有一个udp客户端(我无法控制源代码),它不断发送数据帧,每500毫秒一帧,我有一个udp服务器,每5秒检查一次最后一帧秒。

问题是这个udp服务器没有从操作系统读取最后一帧,而只读取udp缓冲区中的下一帧。

        n = recvfrom(server_sockfd, buf, BUFSIZE, 0, (struct sockaddr *) &new_dax[eqpID].clientaddr,
                 &new_dax[eqpID].clientlen);

如果我的udpclient发送了以下代码:

FRAME 1 - > 500ms

FRAME 2-> 500ms

FRAME 3-> 500ms

FRAME X-> 500ms

我的udp服务器首先收到FRAME 1,然后在5秒钟后,当我尝试从客户端读取帧时,服务器收到FRAME 2而不是FRAME X.

如何收到最后一帧?当我想要接收最后一帧时,我尝试关闭服务器套接字并再次打开它,但这耗费了大量资源。是否可以在不关闭服务器套接字的情况下使用它?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用recvmmsg()一次接收大量邮件。因此,在您的情况下,您希望每次读取收到大约10条消息,因此为12-15条消息设置缓冲区并只调用recvmmsg()一次,然后忽略除最后一条消息之外的所有消息。

您希望使用MSG_WAITFORONE标记,以便recvmmsg()在收到所有12-15封邮件之前不会阻止 - 您只希望收到9-11左右。