发送广播数据报

问题描述 投票:19回答:3

我需要向连接到我的网络的所有计算机(服务器)发送广播数据报。

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

谢谢。

javascript node.js udp broadcast multicast
3个回答
18
投票

我从未使用过Node.js,但我确实记得,使用Berkely套接字(这似乎是套接字使用最广泛的实现),您需要启用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");

您可能想以编程方式找到广播地址,但是我不能为您提供帮助。


22
投票

我花了很多时间试图能够在计算机之间进行UDP广播和多播。希望这会使其他人更轻松,因为在网上很难找到该主题的答案。这些解决方案适用于Node版本6.x-12.x:

UDP广播

计算广播地址

广播地址=(〜子网掩码)| (主机的IP地址)-参见Wikipedia。使用ipconfig(Windows)或ifconfig(Linux),或检出netmask module

服务器(记住将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 = Buffer.from("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 Multicast Address Space Registry部分6中查看RFC 2365 manual和更深入的说明,我们发现适当的本地范围多播地址是239.255.0.0/16和239.192.0.0/14(也就是说,除非获得许可,否则,使用其他的)。

下面的多播代码在具有这些地址的Linux(和许多其他平台)上正常工作。

大多数操作系统通过特定的接口发送和侦听多播,默认情况下,如果有多个接口,它们通常会选择错误的接口,因此您永远不会在另一台计算机上接收多播(您只能在本地主机上接收多播)。在Node.js docs中阅读更多内容。为了使代码可靠地工作,请更改代码,以便为要使用的接口指定主机的IP地址,如下所示:

服务器-server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

客户-client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

查看这些支持源:NodeJSJavaC#和有用的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 () {         // Add the HOST_IP_ADDRESS for reliability
    setInterval(multicastNew, 4000);
});

function multicastNew() {
    var message = Buffer.from("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);   // Add the HOST_IP_ADDRESS for reliability
});

UPDATE: additional optionsserver.send(在文档中命名为socket.send)。您可以为msg使用字符串而不是缓冲区,并且根据您的版本,几个参数是可选的。您还可以检查回调函数是否发生错误。

UPDATE:从Node.js v6开始,不推荐使用new Buffer(str),而推荐使用Buffer.from(str)。上面的代码已更新,以反映此更改。如果使用的是早期版本的Node,请使用以前的语法。


11
投票

我认为自节点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();
    });
});

希望这对某人有帮助;)

© www.soinside.com 2019 - 2024. All rights reserved.