2012-01-17 13 views
13

क्या कोई यूडीपी होल पंचिंग का उदाहरण दे सकता है?यूडीपी होल पंचिंग एल्गोरिदम

असल में, मैं एक चैट प्रोग्राम लिखना चाहता हूं जिसके साथ लोग एक-दूसरे के आईपी को जानते समय चैट कर सकते हैं। लेकिन दोनों मशीन फायरवॉल राउटर के पीछे होंगे। तो, मुझे संवाद करने के लिए एक छेद पंच करने की जरूरत है।

मैं एक समारोह चाहते हैं इस तरह के समारोह बुला पर, एक छेद मुक्का मारा है कि कर दिया गया है और भविष्य संचार आसानी से आगे बढ़ना होगा - अगर उस :)

लिए पूछने के लिए बहुत ज्यादा नहीं है
+1

के संभावित शिकार: http://stackoverflow.com/questions/8523330/programming-p2p-application/8524609#8524609 – selbie

+0

कोई साधारण समारोह है कि आप सिर्फ इतना है कि इच्छा कॉल कर सकते हैं है अपने सभी एनएटी ट्रैवर्सल समस्याओं को हल करें। एनएटी ट्रैवर्सल और पी 2 पी पर लंबी चर्चा के लिए उपरोक्त लिंक देखें। – selbie

उत्तर

18

लघु उत्तर: यह कर सकते हैं ' विश्वसनीय रूप से नहीं किया जा सकता है।

लांग उत्तर:

"होल छिद्रण" आदेश भीतर का यातायात अनुमति देने के लिए एक रूटर के स्वत: नेट नियम को ट्रिगर करने के लिए संदर्भित करता है। जब आप एक यूडीपी पैकेट भेजते हैं, राउटर (आमतौर पर) आपके स्रोत पते और बंदरगाह को गंतव्य पते और बंदरगाह पर मैपिंग करने के लिए एक अस्थायी नियम बनाता है, और इसके विपरीत। गंतव्य पते और बंदरगाह (और कोई अन्य) से लौटने वाले यूडीपी पैकेट मूल स्रोत पते और बंदरगाह (और कोई अन्य) तक पारित नहीं होते हैं। निष्क्रियता कुछ मिनटों के बाद यह नियम समय-समय पर समाप्त हो जाएगा।

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

किसी प्रोग्राम के लिए एनएटी के पीछे होने पर सीधे अपने सार्वजनिक आईपी पते को निर्धारित करने का कोई तरीका नहीं है (यह केवल 192.168.x.x जैसे निजी पता ही देखेंगे)। लेकिन चूंकि आप यह मान रहे हैं कि इंसानों को एक दूसरे के आईपी पते पता है, वे इंसान सिर्फ दूसरे के पते में टाइप कर सकते हैं।

लेकिन वास्तविक पकड़ यह है कि कार्यक्रम के लिए सीधे यह निर्धारित करने का कोई तरीका नहीं है कि सार्वजनिक पक्ष पर राउटर किस पोर्ट नंबर का उपयोग कर रहा है। आपका प्रोग्राम स्थानीय मशीन पर 12345 तक बाध्य हो सकता है, लेकिन राउटर सार्वजनिक पक्ष पर लगभग किसी भी बंदरगाह को मैप कर सकता है। (पोर्ट 12345 से बाहर भेजकर अपने स्थानीय नेटवर्क पर दो कंप्यूटरों की कल्पना करें, जाहिर है कि राउटर को उनमें से एक को एक अलग नंबर पर मैप करना होगा।) भले ही आप और इंसान जानते हों कि आप किस स्थानीय पोर्ट नंबर से बंधे हैं, वहां यह जानने का कोई तरीका नहीं है कि राउटर किस पोर्ट नंबर को दुनिया में दिखाएगा।

+9

सेठ - आप एनएटी ट्रैवर्सल की समस्याओं को बहुत अच्छी तरह से रेखांकित करते हैं, लेकिन आप ऐसा लगता है कि इसे हल करना असंभव समस्या है। लेकिन हकीकत में, स्टन, टर्न, आईसीई, और एक विश्वसनीय सिग्नलिंग सेवा का संयोजन पी 2 पी कनेक्टिविटी को बहुत विश्वसनीय बनाता है। इसे एक और तरीका डालना - सार्वजनिक इंटरनेट पर सर्वर नोड्स सीधे कनेक्ट हो जाते हैं। – selbie

+0

आप सही हैं कि समस्या काफी हद तक दूर हो जाती है * यदि * आप विश्वसनीय रूप से किसी तृतीय-पक्ष रिले तक पहुंच सकते हैं। @ c.adhityaa वास्तव में नहीं कहता था कि प्रत्यक्ष संचार एक आवश्यकता थी, इसलिए मुझे पूछा जाना चाहिए था। इसके अलावा, यदि आप विश्वसनीयता की आवश्यकता को आराम देते हैं, तो दोनों सहकर्मी एक-दूसरे को एक-दूसरे को एक दूसरे को भेजते हैं, जबकि दूसरे समय में अधिकतर काम कर सकते हैं।मैं कॉरपोरेट फ़ायरवॉल से निपटने के लिए उपयोग किया जाता हूं, इसलिए नेटवर्क की अनुमति देने के बारे में मैं अत्यधिक निराशाजनक हो सकता हूं। –

7

लिडग्रेन की नेटवर्किंग लाइब्रेरी में यह कार्यक्षमता अंतर्निहित है। अपने एप्लिकेशन में लाइब्रेरी जोड़ने के बाद, आप नेटसेवर को तुरंत चालू करेंगे, दो नेटक्लिएंट कनेक्ट होंगे, और NetServer.Introduce() को कॉल करें।

Lidgren के लिए लिंक: https://github.com/lidgren/lidgren-network-gen3

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