web-dev-qa-db-ja.com

ブロードキャストデータグラムを送信する

ネットワークに接続されているすべてのマシン(サーバー)にブロードキャストデータグラムを送信する必要があります。

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

ありがとう。

19
Wassim AZIRAR

Node.jsを使用したことはありませんが、Berkelyソケット(ソケットの最も広く使用されている実装のようです)では、SO_BROADCASTソケットオプションを有効にしてデータグラムをブロードキャストアドレスに送信できるようにする必要があることを思い出します。 。 dgramのドキュメントを調べると、 そのための関数 があるようです。

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

プログラムでブロードキャストアドレスを調べたいと思うかもしれませんが、私はそれを手伝うことはできません。

15
zneak

コンピューター間でUDPブロードキャストとマルチキャストを実行できるようにするために多くの時間を費やしました。このトピックはウェブ上で答えを見つけるのが非常に難しいので、うまくいけば、これは他の人にとってより簡単になるでしょう。これらのソリューションはNode 0.12.5:

UDPブロードキャスト

ブロードキャストアドレスを計算します

ブロードキャストアドレス=(〜サブネットマスク)| (ホストのIPアドレス) Wikipedia を参照してください。 ipconfig(Windows)またはifconfig(Linux)を使用するか、 ネットマスクモジュール をチェックアウトします。

サーバー(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マルチキャストアドレススペースレジストリ および RFC 2365マニュアル セクション6のより詳細な説明を見ると、適切なローカルスコープのマルチキャストアドレスは239.255.0.0/16であることがわかります。および239.192.0.0/14(つまり、他のものを使用する許可を取得しない限り)。

以下のマルチキャストコードは、これらのアドレスを持つLinux(および他の多くのプラットフォーム)で問題なく機能します。

Windows 8(および明らかにWindows 7および場合によっては他のWindows)は、特定のインターフェイスを介してマルチキャストを送受信します。デフォルトでは、間違ったインターフェイスを選択することが多いため、別のマシンでマルチキャストを受信することはありません(ローカルホストでのみ受信します)。 (テストを通じてこれを理解するのに何時間もかかりました。)コードが確実に機能するように、コードを変更して、使用するインターフェイスのホストの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 () {
    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);
});
_
20
Joseph238

ノード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();
    });
});

これが誰かに役立つことを願っています;)

10
Ingemar