9

मैं केवल लैन के लिए उपयोग किए गए क्रोम पैक किए गए ऐप को बनाना चाहता हूं, जहां एक उदाहरण सर्वर (सत्र होस्ट) के रूप में कार्य करता है और अन्य उदाहरणों को सर्वर को खोजना और सत्र में शामिल होना चाहिए। क्या यह chrome.socket के साथ हासिल किया जा सकता है?प्रसारण या मल्टीकास्टिंग के लिए chrome.socket का उपयोग कैसे किया जा सकता है?

मैं इस तरह सर्वर की स्थापना की है:

var socket = chrome.socket || chrome.experimental.socket; 
socket.create('udp', {}, function(createInfo) { 
    var publish_socket = createInfo.socketId; 
    socket.bind(publish_socket, '225.0.0.42', 42424, function (result) { 
     if (result < 0) console.error(result); // this works fine 
     socket.recvFrom(publish_socket, null, function(recvFromInfo) { 
      console.log(recvFromInfo); // UNABLE TO MAKE THIS HAPPEN 
     }); 
    }); 
    // Chrome won't let me listen for app window closing 
    var cleanup_timer; 
    cleanup_timer = setInterval(function(){ 
      if (requesting_window.closed) { 
       socket.destroy(publish_socket); 
       clearInterval(cleanup_timer); 
      } 
     }, 
     5000 
    ); 
}); 

सॉकेट बाध्य है, मैं ss -ua में देख सकते हैं:

State  Recv-Q Send-Q  Local Address:Port   Peer Address:Port 
UNCONN  0  0   225.0.0.42:42424   *:* 

लेकिन सर्वर कभी नहीं कोई डेटा प्राप्त करने लगता है। मुझे कोई सफलता के साथ chrome.socket एपीआई कुछ डेटा nc -uv 225.0.0.42 42424 का उपयोग करने और लेकिन भेजने की कोशिश की है:

socket.create('udp', {}, function(socketInfo) { 
    var socketId = socketInfo.socketId; 
    socket.sendTo(socketId, str2ab("discovering"), '225.0.0.42', 42424, function(writeInfo) { 
     if (writeInfo.bytesWritten < 0) console.error(writeInfo); 
    }); 
}); 

यह ग्राहक के पक्ष और सर्वर साइड पर कुछ भी नहीं है पर त्रुटि कोड -15 का परिणाम है।

मुझे संदेह है कि कहीं मल्टीकास्ट ध्वज सेट होना चाहिए लेकिन मुझे यह नहीं मिला।

मैं क्रोम संस्करण 23.0.1246.0 देव का उपयोग कर रहा

+1

[शायद यह लिंक आपकी मदद करेगा] (https://github.com/KensakuKOMATSU/chrome-upnp)। –

+0

@Cicada लिंक के लिए धन्यवाद। मैंने 'sendtoo' लाइन से पहले 'socket.bind (सॉकेटआईडी," 0.0.0.0 ", 0, फ़ंक्शन (res) {...}) जोड़ा और डेटा भेजते समय शिकायत करना बंद कर दिया। दुर्भाग्यवश मुझे अभी भी नहीं पता कि ** मल्टीकास्ट पैकेट्स को ** कैसे सुनें। – hlidka

उत्तर

3

बहुस्त्र्पीय पैकेट भेजने के लिए तुम सब करने की जरूरत है एक स्थानीय इंटरफ़ेस से आबद्ध है (0.0.0.0 एक यादृच्छिक बंदरगाह काम करता है, के रूप में आप की खोज की है), और फिर पता सही समूह/बंदरगाह के लिए एक पैकेट (जो sendTo करेगा)।

मल्टीकास्ट डेटा प्राप्त करने के लिए आपको दोनों को सही बंदरगाह से बांधने की आवश्यकता है (0.0.0.0 पर ठीक है), फिर सही मल्टीकास्ट समूह में शामिल हों। आप socket.bind के साथ पहली बिट कर सकते हैं, लेकिन दूसरा आमतौर पर setsockopt और ध्वज IP_ADD_MEMBERSHIP के साथ किया जाता है। दुर्भाग्य से क्रोम सॉकेट एपीआई इस तक पहुंच प्रदान नहीं करता है।

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

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

इसका मतलब है कि किसी अन्य कार्यक्रम के बिना आपकी ओर से मल्टीकास्ट समूह में शामिल होने के लिए आप कुछ भी प्राप्त नहीं कर पाएंगे।

+0

मल्टीकास्ट समूहों में शामिल/छोड़ना अब chrome.socket API (लूपबैक का अनुरोध करने की क्षमता के साथ) में उपलब्ध है। https://developer.chrome.com/apps/socket –

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

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