我有一个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.
如何收到最后一帧?当我想要接收最后一帧时,我尝试关闭服务器套接字并再次打开它,但这耗费了大量资源。是否可以在不关闭服务器套接字的情况下使用它?
谢谢!
答案 0 :(得分:1)
您可以使用recvmmsg()
一次接收大量邮件。因此,在您的情况下,您希望每次读取收到大约10条消息,因此为12-15条消息设置缓冲区并只调用recvmmsg()
一次,然后忽略除最后一条消息之外的所有消息。
您希望使用MSG_WAITFORONE
标记,以便recvmmsg()
在收到所有12-15封邮件之前不会阻止 - 您只希望收到9-11左右。