2012-01-12 28 views
0

私はゲームのためのUDPサーバを書いています。 UDPでマルチソケットを1つのポートに持つことが可能かどうか知っていますか?動的ポート(1つのソケット= 1つのポート)を使用する必要がありますか?udp socket with C++ and windows API

おかげ

答えて

0

Using SO_REUSEADDR...を参照してください:

SO_REUSEADDRソケットオプションはソケットが強制的に別のソケットで使用中の ポートにバインドすることができますSO_REUSEADDR

を使用します。 2番目のソケットは、 というsetsockoptを呼び出し、 元のソケットと同じポートでbindを呼び出す前にoptnameパラメータをSO_REUSEADDRに設定し、optvalパラメータを に設定してブール値TRUEにします。 2番目のソケットが正常にバインドされると、そのポートにバインドされたすべてのソケットの動作は不定になります。 の例では、同じポート上のすべてのソケットがTCPサービスを提供する場合、 ポートを介した着信TCP接続要求は、 が正しいソケットで処理されることが保証されません - 動作は 非決定的です。悪意のあるプログラムはSO_REUSEADDRを使用して、 標準ネットワークプロトコル サービスのためにすでに使用中のソケットを強制的にバインドして、それらのサービスへのアクセスを拒否することができます。このオプションを使用するには特別な 特権は必要ありません。

ボーナス読み:What exactly does SO_REUSEADDR do?

2

1つのUDPポートに複数のソケットを作成することはあまり意味がありません。 UDPはTCPのようなポイント2ポイントプロトコルではないので、特定のポートに1つの "サーバ"ソケットバインドを使用すると、何百ものクライアントを処理できます。

0

SO_REUSEADDRがsetsockoptで指定されている場合は、1つのポートに複数のUDPソケットを設定できます。 しかし、あなたが本当に必要とするのは、複数のクライアントと通信するために1つのUDPソケットを使用することであり、実現可能でもありません。 UDPは接続指向ではなく、sendtoやrecvfromのようなUDP APIは1つのソケット上の異なるピアを区別できます。