2012-02-20 11 views
2

私はSO_BINDTODEVICEを使用しているいくつかのうちから発信インターフェイスへソケットをバインドするアプリケーションを持っています。UDPソケットでインターフェイスを見つける

問題は、私が応答を受け取ったときに、どのインタフェースから来たのかを知る必要があるということです。同じipが複数のインターフェイスにバインドされているため、応答が来たIPアドレスだけでは不十分です。

私は以下のコードをstackoverflowの質問で提供しています。しかし、forループの2回目の繰り返しでセグメンテーション違反が発生することはありません(最初の反復はループの一部を継続します)。

いくつかお手伝いできますか?

C++ DGRAM socket get the RECEIVER address

How to tell which interface the socket received the message from?

+0

OSとは何ですか? TCPまたはUDPソケットでこれを試していますか? – EdwardH

+0

Linux(POSIX API)。それはudpソケットです。今問題は解決されていますが。ソケット作成の直後にIP_PKTINFOオプションを設定する必要があるようです。受信呼び出しの直前でそれを行うと、インターフェイスインデックス0が常に返されます。この間、ソケットはデータの送信にも使用され、受信用の選択ディスクリプタセットに追加されました。 – fayyazkl

+0

[ソケットがどのインタフェースからメッセージを受け取ったかをどのように伝えるか?](http://stackoverflow.com/questions/603577/how-to-tell-which-interface-the-socket-received-the-message -から) –

答えて

0

問題が解決されます。 IP_PKTINFOオプションは、ソケットを作成した直後にソケットを使用する前に設定する必要があり、正常に動作します。

私の場合、私はデータを送信するために作成後にソケットを使用していましたが、後者は読み取りのための選択ディスクリプタセットに追加されました。最後にreceiveを呼び出す直前に、私はIP_PKTINFOを設定していて、常にインターフェイスインデックス0を返しました。

関連する問題