chrome.socket 如何用于广播或多播?
Posted
技术标签:
【中文标题】chrome.socket 如何用于广播或多播?【英文标题】:How can chrome.socket be used for broadcasting or multicasting? 【发布时间】:2012-08-28 12:34:54 【问题描述】:我想创建一个仅用于 LAN 的 Chrome 打包应用程序,其中一个实例用作服务器(会话主机),其他实例必须发现服务器并加入会话。这可以通过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
);
);
socket绑定了,在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 开发版
【问题讨论】:
Maybe this link will help you. @Cicada 感谢您的链接。我在sendTo
行之前添加了socket.bind(socketId, "0.0.0.0", 0, function(res) ...)
,它在发送数据时停止抱怨。不幸的是,我仍然不知道如何收听多播数据包。
【参考方案1】:
要发送多播数据包,您需要做的就是绑定到本地接口(@987654322@ 可以使用随机端口,正如您所发现的那样),然后将数据包寻址到正确的组/端口(这就是sendTo
可以)。
要接收多播数据,您需要绑定到正确的端口(@987654324@ 很好),然后加入正确的多播组。您可以使用socket.bind
完成第一个位,但通常使用setsockopt
和标志IP_ADD_MEMBERSHIP
完成第二个位。不幸的是,Chrome 套接字 API 不提供对此的访问。
当您进行此调用时,系统会向网络发送 IGMP,指示路由器将特定组的多播数据包转发到您的接口,绑定到正确的端口就足以接收它们。您通常还可以指示操作系统使用环回接口复制多播数据包(因此您可以在同一台机器上使用多播)。如果机器直接连接在一起,您可能会发现您现有的代码将起作用,但如果您通过交换机连接则不会(因为它会丢弃未订阅的数据包),如果您在同一台机器(因为数据包不通过环回接口路由)。
对此的传统解决方案是自己创建一个 IGMP 数据包,这将允许多播通过交换机工作,而不是在本地计算机上工作。不幸的是,这需要访问才能发送原始 IP 数据包(不是 TCP 或 UDP),而 chrome.socket
不提供。
这意味着如果没有其他程序代表您加入多播组,您将无法接收任何内容。
【讨论】:
加入/离开多播组现在可以在 chrome.socket API 中使用(以及请求环回的能力。)developer.chrome.com/apps/socket 此 API 是已弃用的 Chrome 应用平台的一部分。以上是关于chrome.socket 如何用于广播或多播?的主要内容,如果未能解决你的问题,请参考以下文章