2010-11-24 6 views
0

自分のマシン(eth0-2)に3つのネットワークインターフェイスがあり、それぞれ独自のネットワークサブネット192.168.10を持っています。 ,192.168.20。,192.168.30。 。私はBSDソケットを使って1つのポートで特定のNICのポートをリッスンしているのだろうかと疑問に思っていました。たとえば、eth1(192.168.20。)のポート10000でリッスンします。 。私が現在使用しているOSはUbuntuですが、私はPOSIXシステム上で動作するようにしたいと思います。特定のNICにposix形式でバインドする

私はC++で自分のアプリケーションを開発していますが、C++のネットワーキングライブラリに関するガイダンスを参考にしていますが、私はQtを見てきましたが、ライセンスは開発タイプには適していませんやって

答えて

2

bind()システムコールでは、ソケットをバインドするアドレスを指定できます。特定のアドレスにバインドすることも、INADDR_ANYにバインドすることもできます。INADDR_ANYは、インターフェイスに関係なく、すべての着信アドレスをリッスンします。

ネットワークライブラリに関しては、boost :: asioは良いです。もちろん、より良い推奨を得るために、「ネットワーキングライブラリ」よりも多くの要件を指定することもできます。

0

あなたBIND(例えば、ポート10000上、)ホスト上のすべてのIPへの単一のリスニングソケットならば、私は特定のをACCEPTれているIPアドレスを決定する一般的なメカニズムがあると信じていません。 -ed接続が入って来た。

一つの解決策は、着信接続を監視するためにSELECTを使用し、その後BINDにあなたの3のIPアドレスのそれぞれに別々のソケットである、と。そうすることで、どの着信IPアドレスが使用されたかを常に知ることができます。

また、クライアント側のプロトコルを完全に制御できる場合は、クライアントがソケット接続の確立直後に使用されたターゲットIPを送信するように設計することができます。これにより、単一のサーバーソケットを使用してすべての着信接続をリスンすることができますが、クライアントが提供していた情報を信頼する必要があります。

+3

'getsockname()'を使って 'accept()'によって返されたソケットに使われたローカルアドレスを知ることができます。 – caf

+0

cafが述べたように、回線のサーバアドレスを知る必要がある場合は、 'getsockname()'を使います。あなたが聞きたいアドレスのそれぞれを知っていれば、別のリスニングソケットを使うのはいいですが、すべてのインターフェースでリッスンしたいならば、 'IPADDR_ANY'と' getsockname() 'を使うのが良いでしょう。クライアントに応じて、あなたは一丸となって悪い考えのように思えます。しかし、あなたはこれを必須のものとは言いません... – janm

+0

私はgetsockname()について知りませんでした。提案に感謝します。 –

関連する問題