2013-02-05 20 views
5

2つのネットワークルートのいずれかを使用してサーバーに接続したいとします。どのようにこれを行うでしょうか?私はかなりグーグルグーグルして、一般的な答えは、ルーティングテーブルとバイリンガルですが、宛先が単一のIPアドレスを持っているので、これは役に立ちません。ほとんどの例では、ネットカードが1つのクライアントとNICが複数あるサーバーがありますが、この場合は逆です。特定のインターフェイスでのTCP/IP接続

ForceBindIPアプリケーションは、この種の機能を提供できると思われるので、可能でなければならないと思います。

   +----->-------+ 
192.168.1.3 |  B  |   192.168.1.4 
     +--------+  +--------+  +--------+ 
     | Client |  | Switch |-->---| Server | 
     +--------+  +--------+  +--------+ 
192.168.1.2 |  A  | 
      +----->-------+ 

これを行うには、おそらくC++とwinsockを使用しています。私は任意のルート上で自由に接続を開くことができる必要があります(つまり、特定のルートに静的にバインドしてはいけません)。私はプレーンオールのTCP/IPを使用しています。

EDIT:Windows 7クライアント

+1

Linux上で、あなたは、あるいは単なるバインド()(もし2つのデバイスを持っている場合)の前にローカルIPアドレスを区別するための接続SO_BINDTODEVICEを使用することができます。 – cdleonard

+0

ありがとうございますが、Windowsクライアントを使用しています –

+3

Windowsバインドには同じ機能があり、バインドするIPを指定してください:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs。 85).aspx – fileoffset

答えて

5

connect()ConnectEx()、またはWSAConnect()を呼び出す前192.168.1.3または192.168.1.2のいずれかにソケットをバインドするbind()機能を使用してください。これは、特定のインタフェースが発信接続に使用するソケットを指示します。たとえば:また

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

sockaddr_in localaddr = {0}; 
localaddr.sin_family = AF_INET; 
localaddr.sin_addr.s_addr = inet_addr("192.168.1.3"); 
bind(s, (sockaddr*)&localaddr, sizeof(localaddr)); 

sockaddr_in remoteaddr = {0}; 
remoteaddr.sin_family = AF_INET; 
remoteaddr.sin_addr.s_addr = inet_addr("192.168.1.4"); 
remoteaddr.sin_port = 12345; // whatever the server is listening on 
connect(s, (sockaddr*)&remoteaddr, sizeof(remoteaddr)); 

addrinfo localhints = {0}; 
localhints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; 
localhints.ai_family = AF_INET; 
localhints.ai_socktype = SOCK_STREAM; 
localhints.ai_protocol = IPPROTO_TCP; 

addrinfo *localaddr = NULL; 
getaddrinfo("192.168.1.3", "0", &localhints, &localaddr); 
bind(s, localaddr->ai_addr, localaddr->ai_addrlen); 
freeaddrinfo(localaddr); 

addrinfo remotehints = {0}; 
remotehints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; 
remotehints.ai_family = AF_INET; 
remotehints.ai_socktype = SOCK_STREAM; 
remotehints.ai_protocol = IPPROTO_TCP; 

addrinfo *remoteaddr = NULL; 
getaddrinfo("192.168.1.4", "12345", &remotehints, &remoteaddr); 
connect(s, remoteaddr->ai_addr, remoteaddr->ai_addrlen); 
freeaddrinfo(remoteaddr); 
関連する問題