2016-05-15 16 views
1

我有一個select兩個UDP套接字。有時select返回2,所以這兩個套接字已準備好進行接收,但我想首先收回可用於讀取的最舊消息。有什麼方法可以將它歸檔?選擇fd_set按消息到達時間排序

我需要的是第一個到達,第一消息:

  • 消息M1在時間T1插座S1抵達。
  • 消息m2時間t2抵達插座s2

T1 < T2:所以我一定要得到的消息M1首先從插座S1

現在我有一些與此類似:

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

    // ... 

} 
+3

簡答:你不能。 – wildplasser

回答

2

如果select返回2,這意味着你的進程被搶先(未準備好運行),從第一個數據包到達的時間的時候,第二個包到了。所以沒有辦法知道哪個先到達。就您的過程而言,這兩個數據包同時到達。

另請注意,網絡中的路由器可以(並且)重新排序和延遲數據包。所以,即使你先從一臺計算機發送數據包A然後再發送B(半秒鐘後),也不能保證數據包A會在B之前到達。一般來說,如果你的代碼依賴於UDP數據包的到達順序,那麼它只是不會在現實世界中工作。