chrome.socket如何用于广播或多播?

时间:2012-09-03 20:10:38

标签: javascript google-chrome-extension broadcast multicast multiplayer

我想创建一个仅用于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
    );
});

套接字是绑定的,我可以在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

1 个答案:

答案 0 :(得分:3)

要发送多播数据包,您需要做的就是绑定到本地接口(0.0.0.0,随机端口正常工作,如您所发现的那样),然后将数据包发送到正确的组/端口(是sendTo将要做的事。

要接收组播数据,您需要绑定到正确的端口(在0.0.0.0上正常),然后加入正确的组播组。您可以使用socket.bind执行第一位,但第二位通常使用setsockopt和标记IP_ADD_MEMBERSHIP完成。很遗憾,Chrome套接字API无法访问此内容。

当您拨打此电话时,系统会向网络发送IGMP,指示路由器将特定组的组播数据包转发到您的接口,然后绑定到正确的端口即可接收它们。您通常也可以指示操作系统使用环回接口复制多播数据包(因此您可以在同一台计算机上使用多播)。您可能会发现,如果计算机直接连接在一起,您的现有代码将会起作用,但如果您通过交换机连接则不会(因为它会丢弃您尚未订阅的数据包),而不是如果您在同一台机器(因为数据包不通过环回接口路由)。

传统的解决方案是自己创建一个IGMP数据包,这将允许多播通过交换机工作,但不能在本地计算机上工作。不幸的是,这需要访问发送原始IP数据包(而不是TCP或UDP),chrome.socket不提供。

这意味着如果没有其他程序代表您加入多播群组,您将无法收到任何内容。