2016-05-15 16 views
1

私はselectを2つのUDPソケットに持っています。ときどきselectは2を返すので、両方のソケットは受信準備が整っていますが、最初に読める最も古いメッセージを受け取りたいと思います。これをアーカイブする方法はありますか? T1はソケットS1に到着した時にselect fd_setメッセージの到着時間で

  • メッセージM1

    は、私が最初にまず、到着したメッセージを取得する必要があります。時間T2

  • メッセージ平方メートルはソケットS2に到着しました。

T1 < T2:だから私は、ソケットS1からの最初のメッセージM1を取得する必要があります。

今私はこれに似た何かを持っている:選択戻り2場合

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

を、それは最初のパケットがその時間に到着した時から(実行する準備ができていない)あなたのプロセスが横取りされたことを意味し2番目のパケットが到着しました。したがって、最初に到着したことを知る方法はありません。プロセスに関する限り、2つのパケットは同時に到着しました。

また、ネットワーク内のルータは、パケットの並べ替えや遅延を行うことができます。したがって、最初にパケットAを送ってからB(半分後で)を1台のコンピュータから送信したとしても、パケットAがBの前に到着するという保証はありません。一般に、あなたのコードがUDPパケットが到着する順序に依存する現実の世界では機能しません。

関連する問題