chrome.socket如何用于广播或多播
How can chrome.socket be used for broadcasting or multicasting?
我想创建一个仅用于LAN的Chrome Packaged应用程序,其中一个实例充当服务器(会话主机),其他实例必须发现服务器并加入会话。这可以用chrome.socket实现吗?
我设置了这样的服务器:
var socket = chrome.socket || chrome.experimental.socket;
socket.create('udp', {}, function(createInfo) {
var publish_socket = createInfo.socketId;
socket.bind(publish_socket, '225.0.0.42', 42424, function (result) {
if (result < 0) console.error(result); // this works fine
socket.recvFrom(publish_socket, null, function(recvFromInfo) {
console.log(recvFromInfo); // UNABLE TO MAKE THIS HAPPEN
});
});
// Chrome won't let me listen for app window closing
var cleanup_timer;
cleanup_timer = setInterval(function(){
if (requesting_window.closed) {
socket.destroy(publish_socket);
clearInterval(cleanup_timer);
}
},
5000
);
});
套接字已绑定,我可以在ss -ua
:中看到它
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 225.0.0.42:42424 *:*
但服务器似乎从未接收到任何数据。我曾尝试使用nc -uv 225.0.0.42 42424
和chrome.socket API发送一些数据,但没有成功:
socket.create('udp', {}, function(socketInfo) {
var socketId = socketInfo.socketId;
socket.sendTo(socketId, str2ab("discovering"), '225.0.0.42', 42424, function(writeInfo) {
if (writeInfo.bytesWritten < 0) console.error(writeInfo);
});
});
这导致客户端出现错误代码-15
,而服务器端没有任何错误代码。
我怀疑应该有一个多播标志设置在某个地方,但我找不到它。
我使用的是Chrome版本23.0.1246.0 dev
要发送多播数据包,您只需要绑定到本地接口(如您所发现的,带有随机端口的0.0.0.0
可以工作),然后将数据包寻址到正确的组/端口(这就是sendTo
将要做的)。
要接收多播数据,您需要同时绑定到正确的端口(在0.0.0.0
上可以),然后加入正确的多播组。您可以使用socket.bind
执行第一位,但第二位通常使用setsockopt
和标志IP_ADD_MEMBERSHIP
执行。不幸的是,Chrome套接字API不提供对此的访问。
当您进行此调用时,系统会将IGMP发送到网络上,指示路由器将特定组的多播数据包转发到您的接口,绑定到正确的端口就足以接收它们。您通常还可以指示操作系统使用环回接口复制多播数据包(这样您就可以在同一台机器上使用多播)。如果机器直接连接在一起,你可能会发现你现有的代码可以工作,但如果你通过交换机连接(因为它会因为你没有订阅而丢弃数据包),如果你在同一台机器上(因为数据包不会通过环回接口路由),就不会工作。
传统的解决方案是自己创建IGMP数据包,这将允许多播通过交换机工作,但不能在本地机器上工作。不幸的是,这需要访问来发送原始IP数据包(而不是TCP或UDP),而chrome.socket
不提供这一点。
这意味着,如果没有其他程序代表您加入多播组,您将无法接收任何内容。
- chrome.socket如何用于广播或多播
- 一个轮播页面引导程序中的多个元素
- 具有不同设置的多个引导轮播
- 引导轮播,修改为显示多个项目.无法正常工作的火狐和IE
- AngularJS:在rootScope上广播/发出的事件多次发生
- 将不同的 CSS 与多个猫头鹰轮播一起使用
- Angular JS将msg广播到多个视图,包括模态窗口
- 仅定位此轮播,在同一页面上定位多个轮播
- 将多个轮播与 CaroufredSel 结合使用
- 是否可以在一个页面上有多个 Twitter 引导轮播
- 多个同步的猫头鹰轮播
- 在轮播中加载时出错多个高图表
- 动态创建多个元素(滑块/轮播)
- 如何在chrome应用程序中注册多播DNS服务
- chrome.sockets.udp多播示例/说明
- 引导轮播并显示多个项目
- UDP多广播节点
- UDP多播系统
- WebRTC模拟广播/多流
- 网页上的多个轮播与不同的计时器