【发布时间】: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 开发版
【问题讨论】:
-
@Cicada 感谢您的链接。我在
sendTo行之前添加了socket.bind(socketId, "0.0.0.0", 0, function(res) {...}),它在发送数据时停止抱怨。不幸的是,我仍然不知道如何收听多播数据包。
标签: javascript google-chrome-extension broadcast multicast multiplayer