2013-06-25 12 views
5

私は別のNIC(Network Interface Card)上の複数の独立したネットワークにマシンを接続しています。マシンはWindows 7を実行します。C++で書かれたアプリケーションで特定のNICを指定する方法(boost asio)

TCPを使用して、特定のNICを介して特定のIPに接続する必要のあるアプリケーションをマシンで実行します。アプリケーションは、ネットワーキングにC++ 11とboost asio(1.53.0)を使用し、ソースを変更することができます。

Windows環境でこの問題(エンドポイントIPとNICを指定)を解決するうえで、合理的な方法は何ですか?

現在のソリューションは、コマンドライン "route"コマンドを使用して、ルーティングテーブル内の正しいNICにIPのそれぞれの(ブロック)を永続的なルートとして割り当てます。そうすれば、OSは問題を処理しますが、これは許可されていますが必須ではありません。

答えて

3

open()bind()接続する前にソケットendpointに接続する必要があります。この例では、ループバックインターフェイスにバインドしています。シナリオでは、NICのインターフェイスにバインドできます。

#include <boost/asio.hpp> 

int 
main() 
{ 
    using namespace boost::asio; 
    io_service ios; 
    ip::tcp::socket sock(ios); 
    sock.open(ip::tcp::v4()); 
    sock.bind(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 0)); 
    sock.connect(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 1234)); 
} 

私はWindowsプログラマーではないので、私はこれ以上の詳細な例を提供することはできません。私はGetAdaptersAddressesを使ってNICインターフェイスを列挙できると信じています。 Linuxではgetifaddrs(3)を使用します。

+0

バインドエンドポイントはNICを指定しますが、接続エンドポイントは通常のターゲットエンドポイントですが、正しいですか?これまでのところ正しいとすれば、私はNICを指定するエンドポイントを取得する方法についていません。 – Peter

+0

@Peterはい正しいです、各エンドポイントはTCPソケットの4タプルの一部を指定します:クライアントIP、クライアントポート、サーバIP、サーバポート。クライアントエンドポイントの場合は、そのNICのIPアドレスを使用し、ゼロを使用して一時的なポートを選択する必要があります。 –

+0

ありがとうございました。したがって、ここの追加情報に基づいて:http://stackoverflow.com/questions/6594523/how-could-i-get-or-change-the-ip-address-of-a-disconnected-nic-in-windows MACなどのNICの静的プロパティを使用して、構成内にNICを指定することができます。次に、実行時に、指定したMACなどを使用してOS固有の呼び出し(たとえば、前述のもの)を使用してNICのIPを取得し、NIC IPを使用してソケットをNICにバインドします。 – Peter

関連する問題