2016-05-26 9 views
0

私はconnect()、send()およびrecv()を呼び出すUDPクライアントを持っています。複数のIPアドレスを持つサーバーからの応答を受信して​​いないUDPクライアント

サーバーには複数のIPアドレスがあります。サーバからの応答がクエリと同じIPでない場合、recv()はタイムアウトします。私は、クライアントがconnect()を呼び出しているので、同じIPからの応答しか受け付けないので、これがどこかにあると読んでいます。

サーバーが常にクエリと同じIPから返信するようにする方法はありますか?サーバーがすべてのインターフェイスでリッスンするようにしたいと思います。

更新:クライアントがconnect()を呼び出さず、send()の代わりにsendto()を呼び出すと、recv()はサーバーからの応答を正しく受信します。私はまだ、クエリから来たのと同じIPからの返信を送信することによって、サーバー側でそれを修正します。サーバー上でルーティングが行われていない場合、それは複数のIPを持つ1つのネットワークインターフェイスです。

+0

コードを表示するにはスニペットを記入してください。また、私はrecvが失敗するとは思わない、ほとんどそれは何も受け取りません。最後に、サーバーがあるIPアドレスでメッセージを受信したとは思わないし、途中にNATがある場合は別のIPアドレスから応答を送信する。何か助けが必要な場合は、より多くの詳細を提供する必要があります。 – rodolk

+0

私はもっと明確にすべきです。 recv()はタイムアウトしています。 – upl8

+0

これを覚えていれば、クライアントはサーバーに送信するときに、udpパッケージで受信したポート番号とIPで通信を確立します。サーバーは同じポート番号に戻る必要があります。ファイアウォールのシナリオによっては、「udp hole punching」と呼ばれる問題が発生することがありますが、複数のクライアントの問題には関係しません。複数のクライアントがある場合は、クライアントを分離しておくためのスレッドセーフなコーディングを見ているかもしれません。 – Independent

答えて

0

これは、クライアントコールが1つのIPアドレスとポートに接続すると、別のIPまたはポートから送信されたUDPデータグラムを受信しない場合に意味があります。

+0

私を助けてくれてありがとう。私はなぜそれが起こっているのか理解していますが、サーバー上で解決策を見つけることを望んでいました。私はあなたがコードサンプルを要求したことを知っています。私は1つをまとめようとしていますが、これはより大きなライブラリの一部です。したがって、コードはすべて1か所にあるわけではありません。私は、既存のコードに何か問題があるとは思わないが、デフォルトですべきであるように動作している。受信データグラムと送信データグラムに同じIPを使用するようにデフォルト動作を変更したいと思います。 – upl8

+0

@ upl8、サーバーのソリューションは簡単です。今私はコードを表示する必要はありませんあなたの問題を理解しています。基本的には、サーバーがメッセージを受信したのと同じソケットで応答を送信させる必要があります。 – rodolk

+0

私は二重チェックして、ソケットは受信と送信のために同じです。 Windowsが複数のIPを持っていても、NIC用のソケットを1つだけ作成するようです。これはあなたが期待するものですか?その場合、使用するIPアドレスだけをソケットから知ることはできません。 – upl8

0

サーバがすべてのIPとすべてのポートでリッスンするようにするには、イーサネットレイヤ(rawソケット)でプログラムする必要があります。これはlinkです。

ローソケットでプログラミングする場合、データグラムがアドレス指定されたIPアドレスをコード内でチェックインし、適切なIPから応答することができます。

関連する問題