2016-04-17 12 views
0

TCPソケットを使用したネットワークプログラミング(C & Linux)では、パケットを受信したインターフェイスを確認する方法を教えてください。これはSOCK_DGRAMとIPオプションIP_PKTINFOで非常に簡単に行うことができますが、このオプションはSOCK_STREAMでは機能しません。この場合(私はプログラミングのために)、私はパケットを受け取ったインタフェースを知っていなければなりません(サーバに返す応答はそれに依存します)。TCPソケットで受信インターフェイスを確認する

SOCK_RAWとIPPROTO_TCP(SOCK_RAWを使用してIP_PKTINFOオプションを設定することができます)を使用することをお勧めしますが、これはマシンに到着するすべてのTCPトラフィックを受信することを意味し、それ。私が考えているもう1つの解決策は、ルーティングテーブルに対して宛先IPをチェックしてそこから出口インターフェイスを取得することですが、IPv6はどうですか?運命がIPv6リンクローカルであればどうなるでしょうか?

誰かが別の解決策やアイデアを持っていれば、私はそれを読んでうれしく思います。

+1

あなたがいないパケットごとに、時間を受け入れるにその情報を収集します。これは受け入れられたソケット上で 'getsockname()'によって与えられます。しかし、弱いエンドシステムモデルは信頼できないということを意味します。 – EJP

+0

あなたは正しいです、ありがとうございます – julino

答えて

1

あなたのTCPサーバーがクライアント接続を受け入れると、接続を表すソケットがあります。getsocknameをソケットに接続すると、ソケットに関連付けられたアドレス、つまりあなたの側。 次のステップでは、​​を呼び出して、システム上のすべてのインターフェイスとその情報(eth0など)とIPアドレスなどの情報を取得できます。この時点で、以前に取得したipでこのリストを検索することができますgetsockname、結果としてあなたが望むインターフェイスを得ることができます。

参照:TCPでは

http://linux.die.net/man/2/getsockname

http://linux.die.net/man/3/getifaddrs

+0

はい!それはちょうど正しいです、私はgetsockname()funcionalityを知っていますが、私は前にそれについて考えなかった。とにかくあなたのおかげで、元の投稿で文法的にエラーを修正した人に感謝します:) – julino

関連する問題