2016-08-23 4 views
2

socket(2)からファイルディスクリプタを取得しましたが、connect(2)を実行しました。後で(実行中のプログラムの内部から)基になるトランスポート用のネットワークデバイスを特定する方法はありますか? fd上のstat(2)へのコールは、デバイス番号0を返します。 ioctl(2)またはgetsockopt(2)オプションのいずれも該当しないようです。ソケットを扱うネットワークインタフェース/デバイスを見つけることはできますか?

答えて

0

acceptから、リモートクライアントのIPアドレス(Beejのhere)を取得できるはずです。非対称ルートがないと仮定すると、ローカルルーティングテーブルでそのアドレスへのルートをルックアップできます。ルーティングテーブルは、リモートクライアントにパケットを送信するために使用されるイーサネットデバイスを通知する必要があります。

EDIT:

あなたは、リモートクライアントのアドレスを使用してローカルルーティングテーブルを照会するには、次のコマンドラインツールを使用することができます。そうするための何の確実な方法はありません

ip route get <remote-client-ip-addr> 
1

- POSIXは確かではないが、準拠した方法。

しかし、実際には、インターフェイスの99%を簡単に特定できます。 connectを実行したら、getsocknameを使用してIPアドレスを取得し、一致するIPアドレスを持つボックスの使用可能なインターフェイスのリストを調べます。

+0

['getifaddrs()'](http://man7.org/linux/man-pages/man3/getifaddrs.3.html)を使用して、インターフェイスとそのIPアドレスのリストを取得します。 –

+0

また、Linux 3.8+では、 'getsockopt()'は 'SO_BINDTODEVICE'オプションをサポートしているので、ソケットがどのインタフェースにバインドされているかも分かります。 –

関連する問題