web-dev-qa-db-ja.com

利用可能なポートにバインドする方法は?

UDPパケットをネットワークサーバーに送信し、応答を受信するアプリが必要です。サーバーは、リクエストの送信元と同じポート番号に応答するため、最初にソケットを任意のUDPポート番号にbind()する必要があります。

UDPポート番号をハードコーディングすることは、同じPC上で実行されている他のアプリケーションで使用される可能性があるため、お勧めできません。

UDPソケットを使用可能なポートにバインドする方法はありますか? IMOは、例えば、によって使用されている空きポート番号を迅速に取得するための効果的な方法でなければなりません。 accept()関数。

いいえの場合、バインドを試行してWSAEADDRINUSE/EADDRINUSEステータスを確認するための最良の戦略は何ですか:1025、1025 + Rand()、または他のポートから順番にポートを試行しますか?

44
Soonts

最初にsendtoを呼び出さずに bind を呼び出すと、ソケットは自動的に(空きポートに)バインドされます。

36
avakar

別のオプションは、bind()にポート0を指定することです。これにより、ランダムポートにバインドしながら、特定のIPアドレスにバインドできるようになります(multipleがインストールされている場合)。どのポートが選択されたかを知る必要がある場合は、バインディングの実行後にgetsockname()を使用できます。

209
Remy Lebeau

私は何かを見逃しているに違いありません、なぜあなたはデータを送り返すためにudpソケットを使わないのですか? sendtoで開始し、recvfrom関数を使用して着信データを読み取ります。また、ボーナスとして、データの送信元アドレスを取得します。ここで、すぐに応答を送信できます。

0
Jonke