NODEJS UDP通信


nodejsマルチキャスト通信
最近はnodejsトランスポート層通信の内容を勉強したいです.インターネットで資料を探して自分で勉強しました.自分宛のNodeJs-通信システム-udgramモジュールNode.js:dgramモジュールでUDP通信Node.js Manudual&Docmentation nodejsがTCP/UDPの通信をサポートします.ここではマルチキャスト通信を試してみたいです.まずdgramのUDP通信を試してみます.
UDPマルチキャスト
tcp/ipプロトコルのクラスタの中でIANAはDタイプのipアドレスをマルチキャストに割り当てています.具体的には224.0.0.0-2239.255.255です.各ipは、IGMPプロトコルによって維持されるマルチキャストグループとしてマークすることができる.マルチキャストipアドレスは具体的にいくつかの細分があります.
224.0.0.0224.0.0.255//     ,  224.0.0.0      ,           ;
224.0.1.0224.0.1.255//      ,    Internet;
224.0.2.0238.255.255.255//         (     ),       ;
239.0.0.0239.255.255.255//        ,            。
dgramモジュールのaddMember ship()方法により、socketをマルチキャストグループに参加させ、DRopMember ship()方法でマルチキャストグループを脱退する.マルチキャストグループに参加してこそ、マルチキャストデータを受信することができます.
実現する
//コードは参考のノード.js:dgramモジュールでUDP通信を実現します.
サービスコード:

/*server*/
const dgram = require('dgram'); 
const server = dgram.createSocket('udp4'); //  udp   
const multicastAddr = '224.100.100.100';

//  server.on          
server.on('close',()=>{ // ()=>   ES6     ,   function()     
    console.log('socket   ');
});

server.on('error',(err)=>{
    console.log(err);
});

server.on('listening',()=>{
    console.log('socket     ...');
    server.addMembership(multicastAddr); //     
    server.setMulticastTTL(128);

});

server.on('message',(msg,rinfo)=>{
    console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});

function sendMsg(){
    var message = '    ,     .';
    server.send(message,0,message.length,8061,multicastAddr);
    //  server.send    
    //     ,  (buffer  string),   (        ),    ,     ,   
}

server.bind(8060); //    ,        send        

//    
setInterval(()=>{
    sendMsg();
    console.log("send message");
},1500);
クライアントコード:
/*client*/
//        
const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const multicastAddr = '224.100.100.100';

client.on('close',()=>{
    console.log('socket   ');
});

client.on('error',(err)=>{
    console.log(err);
});
client.on('listening',()=>{
    console.log('socket     ...');
    client.addMembership(multicastAddr);
});
client.on('message',(msg,rinfo)=>{
    console.log(`receive message from ${rinfo.address}:${rinfo.port}:${msg}`);
});
client.bind(8061);
遭遇した問題
同じホストコンピュータではサーバとクライアントが通信できますが、異なるホスト間では通信できません.
推測はホストの上でLANが多すぎて、サーバーは異なっているネットカードを選んで、1つのネットの区間の中でないことを招きます.パケットソースIPをキャプチャし、別の仮想セグメントを使用することを確認した.他のネットワークセグメントのカードを無効にして問題を解決します.
UDP放送
放送住所
ブロードキャストアドレスはマルチキャストよりも簡単で、IPプロトコルはホスト番号がすべて1のアドレスをブロードキャストに残しました.ホスト番号とサブネットマスクを利用して、現在のセグメントのブロードキャストアドレスを算出することができます.
IP  :10.108.92.2
    :255.255.252.0
          ->          ->  IP         ->       10.108.95.255
最後のコードは下記の通りです.上でマルチキャストされたクライアントとサーバーのエンドコードを通じてもよく見えます.実はUDP通信には接続が確立されていません.サービスとクライアントを過度に区別しなくてもいいです.データを送るのはサービスです.受信するのはクライアントです.
var dgram = require('dgram');
var server = dgram.createSocket('udp4');

server.on('close',()=>{
    console.log('socket   ');
});

server.on('error',(err)=>{
    console.log(err);
});

server.on('listening',()=>{
    console.log('socket     ...');
    server.setBroadcast(true);//    
    server.setTTL(128);//    TTL  ,        
    server.send('    ,     .',8061,'10.108.95.255');
    // send {msg=close}      colse   
});
//  messageserver.on('message',(msg,rinfo)=>{
    console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});
//  ,           
server.bind('8060','10.108.92.2');