Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome.socket如何用于广播或多播?_Javascript_Google Chrome Extension_Broadcast_Multicast_Multiplayer - Fatal编程技术网

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

Javascript chrome.socket如何用于广播或多播?,javascript,google-chrome-extension,broadcast,multicast,multiplayer,Javascript,Google Chrome Extension,Broadcast,Multicast,Multiplayer,我想创建一个仅用于局域网的Chrome打包应用程序,其中一个实例用作服务器(会话主机),其他实例必须发现服务器并加入会话。这可以通过以下方式实现吗 我将服务器设置为: var socket = chrome.socket || chrome.experimental.socket; socket.create('udp', {}, function(createInfo) { var publish_socket = createInfo.socketId; socket.bin

我想创建一个仅用于局域网的Chrome打包应用程序,其中一个实例用作服务器(会话主机),其他实例必须发现服务器并加入会话。这可以通过以下方式实现吗

我将服务器设置为:

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
    );
});
但服务器似乎从未收到任何数据。我尝试使用
nc-uv 225.0.0.42 424
和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);
   });
});  
socket.create('udp',{},函数(socketInfo){
var socketId=socketInfo.socketId;
socket.sendTo(socketId,str2ab(“发现”),'225.0.0.42',42424,函数(writeInfo){
if(writeInfo.bytesWrite<0)console.error(writeInfo);
});
});  
这将导致客户端出现错误代码
-15
,而服务器端没有任何错误

我怀疑应该在某个地方设置多播标志,但我找不到它


我正在使用Chrome版本23.0.1246.0 dev

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

要接收多播数据,您需要同时绑定到正确的端口(on
0.0.0.0
可以),然后加入正确的多播组。您可以使用
socket.bind
执行第一位,但第二位通常使用
setsockopt
和标志
IP\u ADD\u MEMBERSHIP
执行。不幸的是,Chrome套接字API不提供对此的访问

当您进行此调用时,系统将向网络发送一个IGMP,指示路由器将特定组的多播数据包转发到您的接口,绑定到正确的端口就足以接收它们。您通常还可以指示操作系统使用环回接口复制多播数据包(这样您就可以在同一台机器上使用多播)。您可能会发现,如果机器直接连接在一起,您现有的代码就可以工作,但如果您通过交换机连接(因为它会在您尚未订阅时丢弃数据包),或者如果您在同一台机器上(因为数据包不通过环回接口路由),则无法工作

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


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

@Cicada感谢您的链接。我在
sendTo
行之前添加了
socket.bind(socketId,“0.0.0.0”,0,function(res){…})
,它在发送数据时停止抱怨。不幸的是,我仍然不知道如何侦听多播数据包。加入/离开多播组现在可以在chrome.socket API中使用(以及请求环回的功能)。该API是不推荐使用的chrome应用程序平台的一部分。
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);
   });
});