長寿命の接続を持つUDPサーバーアーキテクチャでは、受信UDPトラフィックをすべて受信するソケットが1つあり、 connect()を使用してリモートアドレスを設定すると、接続ごとに別々のソケットを作成します。私の質問は、TCPに対してaccept()と同じように原子的に行うことが可能かどうかです。UDP用のエミュレートaccept()(デマルチプレクスされたUDPソケットの設定におけるタイミングの問題)
別のソケットを作成してconnect()を使用する理由は、これによって複数のスレッドにパケット処理を分散しやすくし、必要なデータ構造にソケットを直接関連付けることが容易になるからです処理のために。 ネットワークスタックのデマルチプレクスロジックは、入力パケットを最も特定のソケットにルーティングします。
今、私の質問は次のようにUDPのために)1は、(受け入れるエミュレートしたいときに何が起こるか基本的には次のとおりです。
使用(選択)UDPサーバソケットを含み、FD-セットを持ちます。
次に、UDPサーバーソケットからパケットを読み取ります。
- はその後、その後
が、私は両方のソケットが含まFD-セットでselect()を呼び出してリモートアドレスに()編を接続され、新たなUDPソケットを作成します。
返されるものは何ですか?パケットは、1と3
はUDPサーバソケットにパケットを逆多重化されるか、またはそれは3で作成した複数の特定のソケットに分波されますどこかの間でOSに到着したことを考えると
つまり、どの時点でデマルチプレクスが行われますか?パケットが到着したとき、またはポイント4に到着したときに「あたかもあたかも」起こっていなければならないか?
上記のような場合にはフォローアップの質問があります:これを行うにはどうすればよいですか?
もう一方の端に接続された新しいUDPソケットを作成しても、同じサーバー側のポートを維持できますか? 通常は、サーバー側の別のポートにUDPソケットを作成し、最初の要求にのみ「サーバーソケット」を使用し、さらに2つの異なるポートでピアとの通信をさらに行います。 または、サーバー上に1つのソケットだけを使用して、接続する気にしないでください。ピアアドレスをメモするだけです。とにかくUPDはコネクションレスです。 – nos