我有两个UDP套接字select
。有时候select
返回2,所以两个套接字都准备好进行恢复,但我想首先查看可读取的最旧消息。有什么方法可以存档吗?
我需要先收到消息,首先:
t1 < t2 :所以我必须首先从套接字 s1 获取消息 m1 。
现在我有类似的东西:
recived do_recive(fd_set* container, int nfds, int* sockets, unsigned n_sockets) {
// ...
int activity = select(nfds, container, NULL, NULL, NULL);
// ...
for(i=0;i<n_sockets;i++) {
if(FD_ISSET(sockets[i], container)) {
recvfrom(...);
break;
}
}
// ...
}
答案 0 :(得分:2)
如果select返回2,则表示从第一个数据包到达的时间到第二个数据包到达的时间,您的进程被抢占(未准备好运行)。所以没有办法知道哪个先到了。就您的过程而言,这两个数据包同时到达。
另请注意,网络中的路由器可以(并且确实)对数据包进行重新排序和延迟。因此,即使您从一台计算机先发送数据包A然后再发送B(半秒钟),也无法保证数据包A将在B之前到达。通常,如果您的代码取决于UDP数据包到达的顺序,那么它只是不会在现实世界中发挥作用。