2009-11-22 18 views
6

यदि मेरे सर्वर के पास कई आईपी पते हैं, और मैं उनमें से कुछ (या सभी) सुनना चाहूंगा, तो मैं ऐसा करने के लिए कैसे जा सकता हूं?एकाधिक आईपी पते पर कैसे सुनें?

क्या मुझे प्रत्येक आईपी पते के लिए एक नई सॉकेट बनाने की आवश्यकता है, और इसे बांधें? क्या मैं एकाधिक आईपी पते को एक सॉकेट में बांध सकता हूं? क्या आईपी एड्रेस। कोई भी आईपी पते पर सुनता है? इस मामले पर एमएसडीएन पुस्तकालय बहुत अस्पष्ट है।

उत्तर

13

आप एकाधिक अंतराल पर एक सॉकेट बाध्य नहीं कर सकते हैं। एक SocketException (अमान्य तर्क त्रुटि) दूसरी बार जब आप किसी दिए गए सॉकेट के लिए Bind() पर कॉल करते हैं।

जैसा कि अन्य ने कहा है, आप स्थानीय मशीन पर आईपीवी 4 पते सुनने के लिए IPAddress.Any का उपयोग कर सकते हैं। हालांकि, अगर आप केवल उपलब्ध आईपी पते के सबसेट पर सुनना चाहते हैं, तो आपको अलग सॉकेट बनाना होगा।

+0

ठीक है, निश्चित उत्तर के लिए धन्यवाद। –

+5

नहीं, आईपीएड्रेस। यदि आप बस आईपी v6 पते गिनते हैं तो कोई भी सॉकेट ऑब्जेक्ट्स को सभी आईपी पतों पर बाध्य नहीं करता है। दो सॉकेट ऑब्जेक्ट्स बनाने का सही तरीका है। फिर एक आईपी एड्रेस से बांधता है। कोई भी, और दूसरा IPAddress.IPv6Any से बांधता है। –

+0

अच्छा बिंदु। मेरी परियोजना अभी भी पूरी तरह से आईपीवी 4 है, इसलिए जब मैंने अपना जवाब लिखा तो आईपीवी 6 भी विचार नहीं था। –

2

हां, आईपीएड्रेस। कोई भी सभी इंटरफेस पर सुनेंगे।

http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx

+0

ठीक है, यह मदद करता है (बाइंड विधि केवल यह कहती है कि ढांचे को सुनने के लिए पते चुनता है, जो बहुत अस्पष्ट है)। लेकिन अगर मैं केवल कंप्यूटर को सौंपा गया 10 में से 10 आईपी पते पर सुनना चाहता हूं तो क्या होगा? क्या मुझे इसके लिए 5 सॉकेट चाहिए? या मैं अलग-अलग अंतराल के साथ कई बार बाइंड() को कॉल कर सकता हूं? –

+0

हां, आप एक प्रति पते, जब तक कि आप किसी भी या IPv6Any से बंधे न हों। –

4

तकनीकी तौर पर, अपने सर्वर कभी नहीं यह करने के लिए आवंटित किसी भी IP पते होते हैं।

इसके बजाय, व्यक्तिगत नेटवर्क इंटरफेस को आईपी पते असाइन किए जा सकते हैं। आम तौर पर, प्रत्येक एनआईसी को एक आईपी पता मिलता है, लेकिन यह सिर्फ सबसे आम मामला है।

यदि आप नियंत्रित करना चाहते हैं कि कौन से इंटरफेस आपके चुने हुए बंदरगाह पर आने वाले कनेक्शन के लिए सुन रहे हैं, तो आपको प्रत्येक के लिए एक अलग सॉकेट बनाना होगा।

+1

हां, मुझे पता है कि आप इंटरफेस के लिए आईपी पते असाइन करते हैं, लेकिन .NET आपके द्वारा छुपाता है और आप बस अंतराल पर बाध्य करते हैं। मैं थोड़ी उलझन में हूं कि आप आईपीएड्रेस के साथ मल्टीप्ल इंटरफेस पर क्यों सुन सकते हैं। किसी को भी विशिष्ट लोगों को सुनने के लिए एकाधिक सॉकेट की आवश्यकता है। –

+1

मुझे संदेह है कि यह एक उपयोगी शॉर्टकट प्रदान करने, ढांचे के डिजाइनरों द्वारा "सामान्य मामला हासिल करने में आसान बनाता है" का मामला है। – Bevan

+0

कोई और आईपीवी 6 एनी शॉर्टकट के रूप में माना जा सकता है। लेकिन आप अपने इच्छित शॉर्टकट प्रदान करने के लिए एक ढांचा नहीं पूछ सकते थे। मैं पूरी तरह से बेवन से सहमत हूं। जब आप ढांचे के साथ और अधिक खेलते हैं और आप अपना खुद का डिज़ाइन करना शुरू करते हैं, तो आप देखेंगे कि विकल्प बनाना हमेशा कठिन होता है। –

2

एमएसडीएन पुस्तकालय आईपीएड्रेस के संबंध में विरोधाभासी प्रतीत होता है। कोई भी। बाध्य दस्तावेज़

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx

का कहना है कि 'सबसे उपयुक्त' पता चुन लिया जाता है, लेकिन IPAddress.Any डॉक

http://msdn.microsoft.com/en-us/library/system.net.ipaddress.any.aspx

का कहना है कि इस निरंतर साथ सॉकेट पर गतिविधि के लिए सुनने चाहिए सभी इंटरफेस

हालांकि, मुझे बताया गया है कि यह आईपीएड्रेस है। कोई भी दस्तावेज़ जो सही है।

(इसे एक उत्तर के रूप में जोड़ना क्योंकि मेरे पास टिप्पणियां छोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है)।

3

मैंने इस पर काम किया है, आईपीएड्रेस। कोई भी उचित तरीका नहीं है, यह किसी भी उपयुक्त आईपी पते को बांध देगा। मेरे मामले में मेरे पास 2 एनआईसी है और मैं समस्या को गोली मारने में परेशानी नहीं कर सका। जब मैंने

System.Net.IPAddress ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx"); 
listener = new TcpListener(ipAddress, portNum); 

यह ठीक काम किया।

3

आप सभी IPv4 और IPv6 पतों पर सुनने के लिए चाहते हैं, इस कोड का उपयोग:

var listener = new TcpListener(IPAddress.IPv6Any, port); 
listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); 

IPv6Any विंडोज बताता है आईपीवी 6 ढेर पर सुनने के लिए। सॉकेट विकल्प को झूठ में सेट करना विंडोज को आईपीवी 6 स्टैक पर सीमित नहीं करने के लिए कहता है, बल्कि आईपीवी 4 स्टैक पर भी सुनना है। डिफॉल्ट केवल स्पष्ट रूप से निर्दिष्ट स्टैक पर सुनना है।

+0

वाह, यह सुंदर है ... ummm .. गैर-स्पष्ट;) मुझे लगता है कि यह एकाधिक आईपी के चयन के लिए एक तरीका साबित नहीं करता है। –

+0

इससे अधिकांश लोगों के लिए कोई फर्क नहीं पड़ता है, लेकिन यह केवल .NET 4 या नए में समर्थित है। – eAi

संबंधित मुद्दे