0

次のような UDP マルチキャスト ソケットからデータグラムを受信します。

int res=recvfrom(socketId,buf,sizeof(char) * RECEIVE_BUFFER_SIZE,0, (SOCKADDR *)& Sender, &SenderAddrSize);

MSDN によると、データグラムが利用可能になるまで、この呼び出しはブロックされます。


受信データがソケットで利用できない場合、recvfrom 関数はブロックされ、ソケットが非ブロックでない限り、MSG_PARTIAL フラグが設定されていない WSARecv に対して定義されたブロック規則に従って、データが到着するのを待ちます。


同じスレッドで、別のソケットからもパケットを受信したいと考えています。したがって、1 つのスレッドで 2 つのソケットをリッスンしたいので、両方からのデータをできるだけ早く処理する必要があります。そのため、ブロッキングはrecvfromもう使用できません。そのようなもの (疑似コード) を使用する必要があります。

while (true) {
    non blocking recvfrom call to Socket1
    if new datagram available in Socket1 then process
    non blocking recvfrom call to Socket2
    if new datagram available in Socket2 then process
}

私はソケットを「スピン」すると言います。「回転」が CPU を大量に消費することは理解していますが、私の主な要件はlatencyであるため、これで問題ありません。

これらのソケットからのデータは同じであり、2 つのスレッドからのこのデータを「マージ」するのは少し複雑なので、2 つの異なるスレッドで 2 つのソケットを処理したくありません。 1 つのスレッド。UDP は信頼性が低く、統計的にパケット損失の可能性を減らす必要があるため、両方のソケットをリッスンする必要があります。

次の質問があります。

  • 遅延を改善するためにCPUを使用することに同意することを考慮して、「ソケットをスピン」することは良い考えですか?
  • 通常のブロッキング受信を呼び出す代わりに、「スピニング」ソケットを何マイクロ秒獲得できますか? (まあ、私は何かを獲得しますか、それとも単にCPUパワーを無駄にしていますか?)
4

0 に答える 0