Node.js Multicast Client

时间:2017-07-11 20:46:08

标签: javascript node.js electron multicast

所以我有一台摄像机在我的本地网络上输出udp组播流,我知道它正常工作,因为我可以通过MRL“udp:// @ {multicast_addr}:{通过VLC媒体播放器连接到流”端口}。

我想写一个NodeJS客户端,它至少会承认它正在接收这些udp数据包,但我似乎无法做到正确。从其他stackoverflow帖子,这是我到目前为止。

// Working MRL in VLC: udp://@{multicast_addr}:{port}

var PORT = {port};
var HOST = '{local_addr}';
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.setMulticastTTL(64); 
    client.addMembership('{multicast_addr}', HOST);
});

client.on('message', function (message, remote) {   
    console.log("Packet received")
});

client.bind(PORT, HOST);

当我运行此命令时,我收到消息“UDP客户端侦听{local_addr}:{port}”,但后来没有“收到数据包”消息。谁能告诉我我做错了什么?我误解了udp组播流是如何工作的吗?

感谢任何能提供帮助的人。

编辑:

好的,所以我得到了它的工作,但我不明白如何。在最后一行,而不是绑定(PORT,HOST),我绑定(PORT,{multicast_addr})。在运行它时,我的控制台充斥着“收到数据包”的消息,现在我比以前更加困惑了。

如果有人愿意解释,我将非常感激。

1 个答案:

答案 0 :(得分:0)

addMembership(MADDR, HOST)中,HOST是一个接口引用,系统将查找关联的物理接口,并确保使用该接口订阅它。

bind(PORT , HOST)中,HOST现在是套接字的唯一IP,如果它不是所有地址(v4中为0.0.0.0,如果省略参数,这也是默认值),你是将数据包过滤到任何其他IP,即使它们是出于非单播原因而到达。

如果你想在同一个套接字上发送和接收,那么你将不需要将它绑定到一个特定的地址,但通常更好的形式是使用一个单独的套接字发送,以便它们可以独立调整。