所以我有一台摄像机在我的本地网络上输出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})。在运行它时,我的控制台充斥着“收到数据包”的消息,现在我比以前更加困惑了。
如果有人愿意解释,我将非常感激。
答案 0 :(得分:0)
在addMembership(MADDR, HOST)
中,HOST是一个接口引用,系统将查找关联的物理接口,并确保使用该接口订阅它。
在bind(PORT , HOST)
中,HOST现在是套接字的唯一IP,如果它不是所有地址(v4中为0.0.0.0,如果省略参数,这也是默认值),你是将数据包过滤到任何其他IP,即使它们是出于非单播原因而到达。
如果你想在同一个套接字上发送和接收,那么你将不需要将它绑定到一个特定的地址,但通常更好的形式是使用一个单独的套接字发送,以便它们可以独立调整。