2011-05-30 13 views
14

भेजें मुझे अपने नेटवर्क से जुड़े सभी मशीनों (सर्वर) पर एक प्रसारण डेटाग्राम भेजने की आवश्यकता है।ब्रॉडकास्ट डेटाग्राम

मैं उपयोग कर रहा हूँ NodeJS मल्टीकास्ट

ग्राहक

var dgram = require('dgram'); 
var message = new Buffer("Some bytes"); 
var client = dgram.createSocket("udp4"); 
client.send(message, 0, message.length, 41234, "localhost"); 
// If I'm in the same machine 'localhost' works 
// I need to do something 192.168.0.255 or 255.255.255 
client.close(); 

सर्वर

var dgram = require("dgram"); 

var server = dgram.createSocket("udp4"); 

server.on("message", function (msg, rinfo) { 
    console.log("server got: " + msg + " from " + 
    rinfo.address + ":" + rinfo.port); 
}); 

server.on("listening", function() { 
    var address = server.address(); 
    console.log("server listening " + address.address + ":" + address.port); 
}); 

server.bind(41234); 

धन्यवाद।

+4

क्या आपके प्रश्न? – TJHeuvel

उत्तर

11

मैंने कभी भी नोड.जेएस का उपयोग नहीं किया, लेकिन मुझे याद है कि बेर्कली सॉकेट (जो सॉकेट के सबसे व्यापक रूप से उपयोग किए जाने वाले कार्यान्वयन के रूप में प्रतीत होता है) के साथ आपको SO_BROADCAST सॉकेट विकल्प को प्रसारण पता पर डेटाग्राम भेजने में सक्षम होने की आवश्यकता है । dgram दस्तावेज़ीकरण को देखकर, a function for it प्रतीत होता है।

var client = dgram.createSocket("udp4"); 
client.setBroadcast(true); 
client.send(message, 0, message.length, 41234, "192.168.0.255"); 

आप प्रोग्राम के रूप में प्रसारण पता पता लगाने के लिए चाहते हो सकता है, लेकिन मुझे लगता है कि आप के साथ मदद नहीं कर सकता।

+0

धन्यवाद श्रीमान। यह सेट ब्रॉडकास्ट (सच) था; –

+3

यदि आप 255.255.255.255 का उपयोग करते हैं तो यह प्रति आरएफसी 9 22 के स्थानीय प्रसारण पते के रूप में कार्य करेगा। =) – reconbot

+0

अजीब। इस परिवर्तन के साथ भी, सर्वर क्लाइंट से कुछ भी प्राप्त नहीं करता है। – Michael

9

मुझे लगता है कि नोड 0.10.0 के बाद से कुछ चीजें बदल गया है यह मेरे लिए अब काम करता है:

//var broadcastAddress = "127.255.255.255"; 
var broadcastAddress = "192.168.0.255"; 

var message = new Buffer("Some bytes"); 

var client = dgram.createSocket("udp4"); 
client.bind(); 
client.on("listening", function() { 
    client.setBroadcast(true); 
    client.send(message, 0, message.length, 6623, broadcastAddress, function(err, bytes) { 
     client.close(); 
    }); 
}); 

आशा इस किसी में मदद करता है;)

14

मैं ऐसा करने में सक्षम होने की कोशिश कर बहुत समय बिताया कंप्यूटर के बीच यूडीपी प्रसारण और मल्टीकास्टिंग। उम्मीद है कि यह दूसरों के लिए आसान बनाता है क्योंकि इस विषय को वेब पर उत्तर ढूंढना काफी मुश्किल है। ये समाधान नोड 0.12.5 में काम करते हैं:

यूडीपी प्रसारण

प्रसारण पते की गणना

प्रसारण पता = (~ सबनेट मास्क) | (होस्ट का आईपी पता) - Wikipedia देखें। ipconfig (विंडोज) या ifconfig (लिनक्स) का उपयोग करें, या netmask module चेकआउट करें।

सर्वर

var PORT = 6024; 
var dgram = require('dgram'); 
var client = dgram.createSocket('udp4'); 

client.on('listening', function() { 
    var address = client.address(); 
    console.log('UDP Client listening on ' + address.address + ":" + address.port); 
    client.setBroadcast(true); 
}); 

client.on('message', function (message, rinfo) { 
    console.log('Message from: ' + rinfo.address + ':' + rinfo.port +' - ' + message); 
}); 

client.bind(PORT); 

यूडीपी मल्टीकास्टिंग

var PORT = 6024; 
var BROADCAST_ADDR = "58.65.67.255"; 
var dgram = require('dgram'); 
var server = dgram.createSocket("udp4"); 

server.bind(function() { 
    server.setBroadcast(true); 
    setInterval(broadcastNew, 3000); 
}); 

function broadcastNew() { 
    var message = new Buffer("Broadcast message!"); 
    server.send(message, 0, message.length, PORT, BROADCAST_ADDR, function() { 
     console.log("Sent '" + message + "'"); 
    }); 
} 

क्लाइंट (सही प्रसारण पते के लिए BROADCAST_ADDR बदलने के लिए याद)

मल्टीकास्ट पतों

IPv4 Multicast Address Space Registry और RFC 2365 manual धारा 6 में अधिक गहराई से स्पष्टीकरण को देखते हुए, हम पाते हैं उपयुक्त स्थानीय गुंजाइश मल्टीकास्ट पतों 239.255.0.0/16 और 239.192.0.0/14 (अर्थात, जब तक आप के लिए अनुमति प्राप्त कर रहे हैं अन्य का उपयोग करें)।

नीचे दिए गए मल्टीकास्ट कोड इन पते के साथ लिनक्स (और कई अन्य प्लेटफॉर्म) पर ठीक काम करता है।

विंडोज 8 (और स्पष्ट रूप से विंडोज 7 और संभवतः अन्य) विशिष्ट इंटरफ़ेस के माध्यम से मल्टीकास्ट के लिए भेजता है और सुनता है, और डिफ़ॉल्ट रूप से यह अक्सर गलत इंटरफ़ेस चुनता है, इसलिए आप किसी अन्य मशीन पर मल्टीकास्ट कभी नहीं प्राप्त करते हैं (आप उन्हें केवल स्थानीयहोस्ट पर प्राप्त करते हैं)। (यह मुझे घंटे लगे परीक्षण के माध्यम से यह पता लगा सकते हैं।) कोड, मज़बूती से काम करने के लिए कोड बदलने ताकि आप अंतरफलक आप उपयोग करना चाहते के लिए मेजबान के आईपी पते निर्दिष्ट करते हैं, इस प्रकार है:

सर्वर - server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

क्लाइंट - client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

इन समर्थन स्रोतों पर एक नज़र डालें: NodeJS, Java, C#, और एक सहायक command को देखने के लिए जो मल्टीकास्ट पतों आपने सदस्यता ली - netsh interface ipv4 show joins

सर्वर

var SRC_PORT = 6025; 
var PORT = 6024; 
var MULTICAST_ADDR = '239.255.255.250'; 
var dgram = require('dgram'); 
var server = dgram.createSocket("udp4"); 

server.bind(SRC_PORT, function() { 
    setInterval(multicastNew, 4000); 
}); 

function multicastNew() { 
    var message = new Buffer("Multicast message!"); 
    server.send(message, 0, message.length, PORT, MULTICAST_ADDR, function() { 
     console.log("Sent '" + message + "'"); 
    }); 
} 

ग्राहक

var PORT = 6024; 
var MULTICAST_ADDR = '239.255.255.250'; 
var dgram = require('dgram'); 
var client = dgram.createSocket('udp4'); 

client.on('listening', function() { 
    var address = client.address(); 
    console.log('UDP Client listening on ' + address.address + ":" + address.port); 
}); 

client.on('message', function (message, rinfo) { 
    console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message); 
}); 

client.bind(PORT, function() { 
    client.addMembership(MULTICAST_ADDR); 
}); 
+0

मेरे पास यूडीपी मल्टीकास्टिंग के बारे में एक सवाल है। आपका उदाहरण केवल 1 क्लाइंट के साथ अच्छी तरह से काम करता है। लेकिन मल्टीकास्टेड संदेश सर्वर को प्राप्त करने वाले अधिक क्लाइंट प्राप्त करने के लिए हमें क्या बदलना चाहिए>? धन्यवाद! – Chris

+0

देर से उत्तर के लिए खेद है। मल्टीकास्टेड संदेश प्राप्त करने के लिए कई ग्राहकों के लिए, आपको कुछ भी अतिरिक्त करने की आवश्यकता नहीं है। प्रत्येक क्लाइंट बस उसी मल्टीकास्ट पते की सदस्यता लेता है ('addMembership' फ़ंक्शन का उपयोग करके) सर्वर संदेश भेजता है। सभी ग्राहकों को संदेश प्राप्त होता है (मेरे अनुभव के अनुसार 99.9% सफलता दर के साथ, चूंकि यूडीपी पूरी तरह विश्वसनीय नहीं है)। – Joseph238

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मेरे सवाल में मेरा मतलब कुछ अलग था। मेरा लक्ष्य एक ही मशीन (मैक ओएस) पर कई क्लाइंट चलाने के लिए है कि वे सभी MULTICAST_ADDR के सदस्य हैं। इसका मतलब है कि काम करने के लिए मल्टीकास्टिंग के लिए सभी क्लाइंटों का एक ही पोर्ट होना चाहिए। यूडीपी मल्टीकास्टिंग के लिए अपने कोड का उपयोग करने के लिए मुझे किसी भी तरह का पुन: उपयोग करने की आवश्यकता है पोर्ट कई बार क्लाइंट.जेएस चलाने में सक्षम होने के लिए। मैं dgram.createSocket (विकल्प [, कॉलबैक]) के प्रलेखन में खोजने में कामयाब रहा एक विकल्प पुन: उपयोग क्षेत्र फ़ील्ड लेकिन पोर्ट के बारे में कुछ भी नहीं मिला। यदि आप इस तरह का एक उदाहरण प्रदान कर सकते हैं तो मैं आपका आभारी हूं – Chris

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