按消息到达时间选择fd_set顺序

时间:2016-05-15 16:07:19

标签: c sockets udp

我有两个UDP套接字select。有时候select返回2,所以两个套接字都准备好进行恢复,但我想首先查看可读取的最旧消息。有什么方法可以存档吗?

我需要先收到消息,首先:

  • 消息 m1 t1 时到达套接字 s1
  • 消息 m2 t2 时到达套接字 s2

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;
        }
    }

    // ...

}

1 个答案:

答案 0 :(得分:2)

如果select返回2,则表示从第一个数据包到达的时间到第二个数据包到达的时间,您的进程被抢占(未准备好运行)。所以没有办法知道哪个先到了。就您的过程而言,这两个数据包同时到达。

另请注意,网络中的路由器可以(并且确实)对数据包进行重新排序和延迟。因此,即使您从一台计算机先发送数据包A然后再发送B(半秒钟),也无法保证数据包A将在B之前到达。通常,如果您的代码取决于UDP数据包到达的顺序,那么它只是不会在现实世界中发挥作用。