2013-02-05 35 views
5

Tôi muốn kết nối với máy chủ bằng một trong hai tuyến mạng. Làm thế nào sẽ làm điều này? Tôi đã Googled khá một chút, và câu trả lời phổ biến là để fiddle với bảng định tuyến, tuy nhiên điều này sẽ không giúp đỡ như là điểm đến có một địa chỉ IP duy nhất. Hầu hết các ví dụ đều có một máy khách với một card mạng đơn và một máy chủ có nhiều NIC, nhưng ngược lại trong trường hợp này.Kết nối TCP/IP trên một giao diện cụ thể

Ứng dụng ForceBindIP dường như có khả năng cung cấp loại chức năng này, vì vậy tôi đoán điều đó là có thể.

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

Tôi rất có thể sẽ sử dụng C++ và winsock để thực hiện việc này. Tôi sẽ cần để có thể mở một kết nối trên một tuyến đường nhất định theo ý muốn (tức là không được ràng buộc tĩnh với một tuyến đường cụ thể). Tôi sẽ sử dụng đồng bằng ol 'TCP/IP.

EDIT: Windows 7 client

+1

Trên Linux, bạn có thể sử dụng SO_BINDTODEVICE (nếu bạn có hai thiết bị) hoặc chỉ đơn giản bind() trước khi kết nối để phân biệt giữa các IP địa phương. – cdleonard

+0

Cảm ơn, nhưng bằng cách sử dụng máy khách Windows –

+3

Windows bind có cùng chức năng, bạn chỉ định IP nào sẽ liên kết với: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs. 85) .aspx – fileoffset

Trả lời

5

Sử dụng bind() chức năng để ràng buộc các ổ cắm hoặc là 192.168.1.3 hoặc 192.168.1.2 trước khi gọi connect(), ConnectEx(), hoặc WSAConnect(). Điều đó sẽ cho socket biết giao diện cụ thể nào sẽ sử dụng cho kết nối gửi đi. Ví dụ:

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)); 

Hoặc:

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); 
Các vấn đề liên quan