2013-02-05 37 views
5

मैं दो नेटवर्क मार्गों में से किसी एक का उपयोग कर सर्वर से कनेक्ट करना चाहता हूं। यह कैसे करेगा? मैंने काफी कुछ किया है, और आम जवाब रूटिंग टेबल के साथ बेकार है, हालांकि यह मदद नहीं करेगा क्योंकि गंतव्य के पास एक ही आईपी पता है। अधिकांश उदाहरणों में क्लाइंट को एक नेट नेट कार्ड और एकाधिक एनआईसी वाले सर्वर की सुविधा है, लेकिन यह इस मामले में विपरीत है।एक विशिष्ट इंटरफेस पर टीसीपी/आईपी कनेक्शन

फोर्सबिंडिप ऐप इस प्रकार की कार्यक्षमता प्रदान करने में सक्षम प्रतीत होता है, इसलिए मुझे लगता है कि यह संभव होना चाहिए।

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

मैं शायद ऐसा करने के लिए सी ++ और विंसॉक का उपयोग करूँगा। मुझे इच्छा के किसी दिए गए मार्ग पर कनेक्शन खोलने में सक्षम होना चाहिए (यानी किसी विशेष मार्ग से स्थिर रूप से बाध्य नहीं होना चाहिए)। मैं सादे ओएल 'टीसीपी/आईपी का उपयोग करूँगा।

संपादित करें: विंडोज 7 ग्राहक

+1

linux आप SO_BINDTODEVICE उपयोग कर सकते हैं या पूरी तरह से बाँध (यदि आप दो उपकरणों है)() से पहले स्थानीय आईपी के बीच अंतर करने के लिए कनेक्ट पर। – cdleonard

+0

धन्यवाद, लेकिन एक विंडोज क्लाइंट का उपयोग –

+3

विंडोज बाइंड की एक ही कार्यक्षमता है, आप निर्दिष्ट करते हैं कि कौन सा आईपी बाध्य है: 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);