次のような 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パワーを無駄にしていますか?)