2

ピア ツー ピア アーキテクチャとマルチキャスト通信を使用する分散情報システムを作成しようとしています。

まずはマルチキャスト通信の実装から。私はそれをしたことがないので、なぜ正しく機能しないのか理解するのが難しいいくつかの問題があります.

これが私がなんとかしたことです:

サーバ

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 () {
    client.setBroadcast(true);
    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);
});

サーバーとクライアントを起動すると、すべてが機能します。server.js からのメッセージが正常に client.js に送信されます。

問題

複数のクライアント (ノード) が必要な場合に問題が発生します。将来的には、すべてのクライアント (ノード) に、マルチキャストを使用してすべてのクライアントから情報を送信することを許可しないという間違いを要求したいと思います。

上記のコードを使用すると、同時に 2 つのクライアントを開いて、両方のサーバーからメッセージを受信することができません。

複数のクライアントに接続しようとすると、次のエラーが表示されます。

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: bind EADDRINUSE
    at exports._errnoException (util.js:746:11)
    at dgram.js:224:28
    at dns.js:85:18
    at process._tickCallback (node.js:355:11)
    at Function.Module.runMain (module.js:503:11)
    at startup (node.js:129:16)
    at node.js:814:3

問題は、同じコード (client.js) を同じポートと他のパラメーターで 2 回使用していることだと理解しています。より多くのクライアントでマルチキャストを使用して (server.js 経由で) 送信し、成功したメッセージを受信するために私が犯している間違いは何ですか?

4

2 に答える 2

0

複数のマルチキャスト クライアントが同じポートでメッセージを受信できるようにするには、SO_REUSEADDRおよびIP_MULTICAST_LOOPソケット オプションを設定する必要があります。

于 2016-01-29T01:50:03.767 に答える