私はconnect()、send()およびrecv()を呼び出すUDPクライアントを持っています。複数のIPアドレスを持つサーバーからの応答を受信していないUDPクライアント
サーバーには複数のIPアドレスがあります。サーバからの応答がクエリと同じIPでない場合、recv()はタイムアウトします。私は、クライアントがconnect()を呼び出しているので、同じIPからの応答しか受け付けないので、これがどこかにあると読んでいます。
サーバーが常にクエリと同じIPから返信するようにする方法はありますか?サーバーがすべてのインターフェイスでリッスンするようにしたいと思います。
更新:クライアントがconnect()を呼び出さず、send()の代わりにsendto()を呼び出すと、recv()はサーバーからの応答を正しく受信します。私はまだ、クエリから来たのと同じIPからの返信を送信することによって、サーバー側でそれを修正します。サーバー上でルーティングが行われていない場合、それは複数のIPを持つ1つのネットワークインターフェイスです。
コードを表示するにはスニペットを記入してください。また、私はrecvが失敗するとは思わない、ほとんどそれは何も受け取りません。最後に、サーバーがあるIPアドレスでメッセージを受信したとは思わないし、途中にNATがある場合は別のIPアドレスから応答を送信する。何か助けが必要な場合は、より多くの詳細を提供する必要があります。 – rodolk
私はもっと明確にすべきです。 recv()はタイムアウトしています。 – upl8
これを覚えていれば、クライアントはサーバーに送信するときに、udpパッケージで受信したポート番号とIPで通信を確立します。サーバーは同じポート番号に戻る必要があります。ファイアウォールのシナリオによっては、「udp hole punching」と呼ばれる問題が発生することがありますが、複数のクライアントの問題には関係しません。複数のクライアントがある場合は、クライアントを分離しておくためのスレッドセーフなコーディングを見ているかもしれません。 – Independent