हल्के लैन पीयर की खोज के लिए समाधान?


9

मैंने विशुद्ध रूप से क्रॉस-प्लेटफॉर्म प्रोग्रामिंग के लिए एक पुस्तकालय बनाया। इसके साथ किए गए मेरे गेम एंड्रॉइड, पीसी, लिनक्स, मैक आदि में ठीक चलते हैं।

नेटवर्किंग क्षमताओं को ENET पुस्तकालय द्वारा प्रदान किया जाता है, इसलिए मेरे ऐप्स के बीच सभी संचार टीसीपी या यूडीपी संगत नहीं हैं, लेकिन केवल कस्टम प्रोटोकॉल में, यहां तक ​​कि यूडीपी के आधार पर भी कठिन है।

मुझे नहीं लगता कि मैं ईएनटी के साथ जो करना चाहता हूं वह करना संभव है, इसलिए मैं यहां मदद के लिए कहता हूं!

मुझे लगता है कि मेरे एंड्रॉइड फोन, मेरे लैपटॉप और मेरे पीसी में एक ही गेम चल रहा है। वे सभी एक ही वाईफाई नेटवर्क में हैं, और इसलिए एक लैन में, चाहे उसका वाईफाई हॉटस्पॉट (?) या घरेलू राउटर हो।

मुझे नेटवर्क में अन्य दो की खोज करने के लिए उन 3 साथियों में से प्रत्येक की आवश्यकता है। इसका अर्थ केवल लैन नेटवर्क में जीवित ऐप्स के आईपी को खोजने के लिए है, उनके बीच मल्टीप्लेयर गेम की मेजबानी करने में सक्षम होना है।

मैं ऐसा करने के लिए केवल एक प्रभावी तरीके के बारे में सोच सकता हूं, यूडीपी प्रसारण, प्रतिक्रियाओं की प्रतीक्षा करें, लेकिन अगर वह समाधान है, तो मुझे कुछ छोटा चाहिए, क्योंकि इसके कार्यान्वयन का एकमात्र उद्देश्य है।

अन्य तरीके से लैन एड्रेस सब अरेंज में सभी आईपी से कनेक्ट करने का प्रयास किया जा सकता है, लेकिन मुझे नहीं लगता कि ओएस मेरे साथ इस पर होगा: p


2
मुझे लगता है कि कुछ यूडीपी प्रसारण जाने का रास्ता है, और मैं इसे करने के लिए आपकी आपत्तियों को नहीं समझता, या यह है कि ईएनटी प्रसारण का समर्थन नहीं करता है?
रॉय टी।

वास्तव में, यह नहीं है, यह केवल पहले से ही ज्ञात साथियों को प्रसारित कर सकता है ..
ग्रिम्सव

stackoverflow.com/questions/683624/… क्या यह एक उत्तर को प्रभावित करता है?
ग्रिमशॉ

जवाबों:


5

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

यहां बताया गया है कि यह कैसे काम करता है, एनेट के निर्माता ली साल्ज़मैन के विवरण के आधार पर :

  • आपका गेम सर्वर एक एसेट होस्ट के रूप में, एक सॉकेट पर चलता है
  • सर्वर एक ज्ञात "सुनो" पोर्ट से भी जुड़ता है, एक नियमित यूडीपी सॉकेट के रूप में (यानी एनेट होस्ट नहीं)
  • क्लाइंट UDP प्रसारण संदेश (यानी IP 255.255.255.255) को उस पोर्ट को सुनता है, और प्रतिक्रियाओं का इंतजार करता है
  • LAN के सभी सर्वरों को वह "स्कैनिंग" संदेश प्राप्त होगा, और प्रतिक्रिया दें। आदर्श रूप से आप पोर्ट के साथ जवाब दे सकते हैं कि गेम सर्वर (ईनेट होस्ट) चल रहा है; इस तरह आपको अपने गेम सर्वर को एक निश्चित पोर्ट पर चलाने की आवश्यकता नहीं है)
  • क्लाइंट को कुछ प्रतिक्रियाएं मिलने के बाद, यह पता चलेगा कि कौन से सर्वर मौजूद हैं। फिर आप उनमें से एक को कनेक्ट करने के लिए चुन सकते हैं, एक नियमित एनेट सहकर्मी के रूप में। इस बिंदु पर क्लाइंट को अब UDP "स्कैनर" सॉकेट की आवश्यकता नहीं है।

अच्छी खबर यह है कि एनेट सॉकेट्स का उपयोग करने के लिए आवरण कार्य प्रदान करता है , इसलिए आप एनेट में सब कुछ कर सकते हैं। बुरी खबर यह है कि आवरण बहुत पतला है; आपको सॉकेट प्रोग्रामिंग के बारे में जानना होगा , जैसे कि क्या select()करता है। यही कारण है कि मैं आपको ब्लॉग पोस्ट और नमूना परियोजना पर एक नज़र डालने के लिए प्रोत्साहित करता हूं ताकि आप कोड को कॉपी / पेस्ट कर सकें और अपने आप को बहुत समय बचा सकें।

यहाँ कुछ नोट्स और नुकसान हैं जिन्हें आपको अपना कार्यान्वयन करने के लिए चुनना चाहिए:

  • श्रोता / स्कैनर यूडीपी होना चाहिए, इसलिए आपको उनका उपयोग करके enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)(या SOCK_DGRAMसादे पुराने सॉकेट प्रोग्रामिंग के लिए) बनाने की आवश्यकता है
  • सर्वर "श्रोता" के लिए, पोर्ट एड्रेस को enet_socket_set_option(socket, ENET_SOCKOPT_REUSEADDR, 1)(या SO_REUSEADDR) का उपयोग करके पुन: उपयोग करने की अनुमति दें ताकि एक ही आईपी पर कई सर्वर चल सकें
  • क्लाइंट "स्कैनर" के लिए, आपको यूडीपी सॉकेट enet_socket_set_option(scanner, ENET_SOCKOPT_BROADCAST, 1)(या SO_BROADCAST) का उपयोग करके प्रसारण को सक्षम करना होगा , अन्यथा आप प्रसारण पते पर नहीं भेज सकते। यह केवल एक सुरक्षा सुविधा है , जिससे गलती से नेटवर्क को बाढ़ कर दिया जा सके।

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

  • खेल प्रकार (उदाहरण के लिए "सह-ऑप", "डेथमैच")
  • "मानचित्र", "स्तर" या "अभियान" सर्वर चल रहा है
  • सर्वर के लिए खिलाड़ियों और अधिकतम खिलाड़ियों की संख्या
  • कोई अन्य गेम-विशिष्ट जानकारी जो ग्राहक के निर्णय को कनेक्ट करने या न करने के लिए प्रभावित करेगी। खेलों में "सर्वर ब्राउज़र" और उनके द्वारा दिखाई जाने वाली जानकारी के प्रकार के बारे में सोचें।

बिलकुल यही बात है जो मैं सोच रहा था। प्रसारण जाने का रास्ता है।
लोल्म्स

3

जब आप अपनी लाइब्रेरी को नहीं छोड़ना चाहते हैं, तो आप सिर्फ एक-एक बल प्रयोग कर सकते हैं और हर एक संभावित पते से जुड़ने का प्रयास कर सकते हैं। अधिकांश घरेलू लेन क्लास-सी नेटवर्क (/ 24) हैं, जहां आईपी पते के पहले 24 बिट समान हैं और अंतिम 8 बिट भिन्न हैं। तो आपके पास केवल 255 संभावित आईपी पते हैं।

लेकिन फिर भी, एक यूडीपी प्रसारण करना क्लीनर विकल्प होगा। बस 255.255.255.255 पर एक यूडीपी पैकेट भेजें और एक ही राउटर के पीछे सभी क्लाइंट इसे प्राप्त करेंगे। फिर वे प्रेषक को सूचित करने के लिए पैकेट के स्रोत आईपी और पैकेट के स्रोत पोर्ट पर एक उत्तर भेज सकते हैं।


2
प्लीज प्लीज प्लीज प्लीज प्लीज डोंट ब्रूट-फोर्स।
ट्रेवर पॉवेल

@TrevorPowell ... क्योंकि ...?
फिलीपिंस

2
क्योंकि यह गलत समाधान है। यह विश्वविद्यालयों में काम नहीं करेगा (जो क्लास-सी नेटवर्क का उपयोग नहीं करते हैं) या व्यवसायों में (जो आमतौर पर क्लास-सी नेटवर्क का उपयोग नहीं करते हैं), और आईटी कर्मचारी या तो प्रत्येक खिलाड़ी द्वारा किए जाने वाले लोड को तीव्रता से नापसंद करेंगे। हर बार जब वे 'रिफ्रेश' बटन पर क्लिक करते हैं, तो ब्रूट-फोर्स अपने नेटवर्क के हर आईपी पते पर संदेश भेजने का प्रयास करता है। यह समस्या का सिर्फ एक बुरा समाधान है । एक mathmaking सर्वर के बिना संभावित साथियों का पता लगाने का यह सवाल ठीक है कि प्रसारण किसके लिए है। प्रसारण का उपयोग करें। यह हर तरह से बेहतर है। :)
ट्रेवर पॉवेल

1

आप पर एक नज़र हो सकता था DNS-SD / Zeroconf / Avahi / Bonjour / mDNS । यह ऐप्पल का उपयोग प्रिंटर, आईट्यून्स फ़ोल्डर और इतने पर साझा करने के लिए उपयोग होता है, लेकिन इसे कहीं और अपनाया गया है। अवही एक ओपनसोर्स संस्करण है जो लिनक्स का उपयोग करता है (यदि यह केवल लिनक्स है तो निश्चित नहीं), सुनिश्चित नहीं है कि पूरी चीज कितनी पोर्टेबल है (हालांकि अधिकांश प्लेटफार्मों के लिए कार्यान्वयन हैं)।

यह सब कहने के बाद, यूडीपी को प्रसारित करना संभव है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.