发送广播数据报

我需要将广播数据报发送到连接到我的networking的所有机器(服务器)。

我正在使用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); 

谢谢。

我从来没有使用过Node.js,但是我记得使用Berkely套接字(它似乎是套接字使用最广泛的实现),您需要启用SO_BROADCAST套接字选项才能将数据报发送到广播地址。 查看dgram文档,似乎有一个function 。

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

你可能想通过编程的方式find广播地址,但是我不能帮你。

我花了很多时间试图在计算机之间进行UDP广播和多播。 希望这可以让别人更容易,因为这个话题在网上很难find答案。 这些解决scheme在节点0.12.5中工作:

UDP广播

计算广播地址

广播地址=(〜子网掩码)| (主机的IP地址) – 请参阅维基百科 。 使用ipconfig (Windows)或ifconfig (Linux),或检查networking掩码模块 。

服务器 (请记住将BROADCAST_ADDR更改为正确的广播地址)

 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 + "'"); }); } 

客户

 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); 

UDP多播

多播地址

查看IPv4多播地址空间registry,并在RFC 2365手册第6节中进行更深入的说明,我们发现适当的本地范围多播地址是239.255.0.0/16和239.192.0.0/14(即,除非获得许可使用其他的)。

下面的组播代码在使用这些地址的Linux(以及许多其他平台)上工作得很好。

Windows 8(显然是Windows 7,也可能是其他的)通过特定的接口发送和监听多播,默认情况下它会经常select错误的接口,所以你永远不会在另一台机器上接收多播(你只能在本地主机上接收它们)。 (花费我几个小时才能通过testing得出结论。)要使代码可靠工作,请更改代码,以便为要使用的接口指定主机的IP地址,如下所示:

Server – server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

Client – client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

看看这些支持来源: NodeJS , Java , C#和一个有用的命令 ,看看你订阅了哪些组播地址 – 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.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(); }); }); 

希望这有助于某人;)