gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:55:12 25 4
gpt4 key购买 nike

我想创建一个仅用于 LAN 的 Chrome 打包应用程序,其中一个实例用作服务器( session 主机),其他实例必须发现服务器并加入 session 。这可以用 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
);
});

套接字已绑定(bind),我可以在 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

最佳答案

要发送多播数据包,您需要做的就是绑定(bind)到本地接口(interface)(如您所见,0.0.0.0 可以使用随机端口),然后将数据包寻址到正确的地址组/端口(sendTo 将执行的操作)。

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

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

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

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

关于javascript - chrome.socket 如何用于广播或多播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com