2013-02-05 45 views
5

我想使用两条网络路由之一连接到服务器。如何做到这一点?我搜索了很多东西,常见的答案是摆弄路由表,但是这不会有帮助,因为目的地有一个IP地址。大多数示例都具有带有单个网卡的客户端和具有多个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'。

编辑:Windows 7客户端

+1

在Linux上,你可以使用SO_BINDTODEVICE(如果有两个设备)或只是简单的绑定()之前连接的本地IP地址来区分。 – 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.3192.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);