hli*_*dka 9 javascript multicast multiplayer broadcast google-chrome-extension
我想创建一个仅用于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
);
});
Run Code Online (Sandbox Code Playgroud)
套接字是绑定的,我可以在ss -ua:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 225.0.0.42:42424 *:*
Run Code Online (Sandbox Code Playgroud)
但服务器似乎永远不会收到任何数据.我尝试使用nc -uv 225.0.0.42 42424chrome.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);
});
});
Run Code Online (Sandbox Code Playgroud)
这导致-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没有提供这一点。
这意味着如果没有其他程序代表您加入多播组,您将无法接收任何内容。
| 归档时间: |
|
| 查看次数: |
4871 次 |
| 最近记录: |