【发布时间】:2015-02-16 11:25:26
【问题描述】:
我正在构建一个chrome app 并通过chrome socket api 创建一个UDP 套接字。
有没有办法在不使用外部服务的情况下检索您自己的IP 地址? 我所说的“自己的 IP 地址”是什么意思:client 和 server 都在同一个网络上。 chrome 应用需要使用自己的本地 IP 地址响应 UDP 广播。
实际上有一个chrome socket API 用于该用例。但不幸的是,我只收到以下回调对象:Object {paused: false, persistent: false, socketId: 17},它错过了localAddress 属性。根据documentation,它是SocketInfo 对象中的(可选) 属性。这实质上是我正在运行的代码:
chrome.sockets.udp.create({}, function(socketInfo){
chrome.sockets.udp.getInfo(socketInfo.socketId, function (detailedInfo){
ipAddress = detailedInfo.localAddress;
console.debug(detailedInfo); // containts no `localAddress`
});
});
我也不认为我缺少任何manifest-permissions,因为API documentation 中没有描述特殊权限。这是我使用的:
"sockets": {
"udp": {
"send": "*",
"bind": "*"
}
}
当我使用 Python 时,我可以通过以下方式实现该目标:
import socket
ip_address = socket.gethostbyname(socket.gethostname())
任何帮助都会很棒!
【问题讨论】:
-
如果调用机器有多个网络接口,
gethostbyname()可以返回多个本地IP。 -
错误 - 它只会返回一个 IP 地址。 Python 会选择操作系统提供的接口列表中当前“最高”的接口。这正是我想要的,99% 的其他用户也是如此。
-
相信我,操作系统列表中的“最高”接口并不总是正确的,除此之外,
gethostbyname()执行 DNS 查找,在某些情况下可能会报告意外结果,即使是本地主机名。gethostbyname(gethostname())组合多年来一直被广泛滥用,因为人们误以为它总是返回本地 IP,但事实并非如此。这就是network.getNetworkInterfaces()存在的原因,在不涉及DNS的情况下获得正确准确的本地IP。
标签: javascript sockets google-chrome google-chrome-app