我正在开发一个Chrome扩展程序,它应该发现然后与本地网络中的其他设备进行通信。要发现它们,需要找出自己的IP地址,找出网络的IP范围,以检查其他设备。我被困在如何找到本地机器的IP地址(我不是在谈论本地主机,我也不是在谈论暴露在互联网上的地址,而是在本地网络上的地址)。 基本上,我希望得到的是ifconfig内终端中的background.js输出。
Chrome Apps API提供chrome.socket,似乎可以执行此操作however, it is not available for extensions。通过the API for extensions阅读我没有找到任何似乎使我能够找到本地IP的东西。
我是否遗漏了某些东西,或者由于某些原因这是不可能的?有没有其他方法来发现网络上的其他设备,这也可以做得很好(因为它们将在相同的IP范围内)但是有一些传言从2012年12月开始可能有一个发现API用于扩展似乎没有任何东西存在。
有人有什么想法吗?
答案 0 :(得分:32)
您可以通过WebRTC API获取本地IP地址列表(更准确地说:本地网络接口的IP地址)。任何Web应用程序(不仅仅是Chrome扩展程序)都可以使用此API。
示例:
// Example (using the function below).
getLocalIPs(function(ips) { // <!-- ips is an array of local IP addresses.
document.body.textContent = 'Local IP addresses:\n ' + ips.join('\n ');
});
function getLocalIPs(callback) {
var ips = [];
var RTCPeerConnection = window.RTCPeerConnection ||
window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
var pc = new RTCPeerConnection({
// Don't specify any stun/turn servers, otherwise you will
// also find your public IP addresses.
iceServers: []
});
// Add a media line, this is needed to activate candidate gathering.
pc.createDataChannel('');
// onicecandidate is triggered whenever a candidate has been found.
pc.onicecandidate = function(e) {
if (!e.candidate) { // Candidate gathering completed.
pc.close();
callback(ips);
return;
}
var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1];
if (ips.indexOf(ip) == -1) // avoid duplicate entries (tcp/udp)
ips.push(ip);
};
pc.createOffer(function(sdp) {
pc.setLocalDescription(sdp);
}, function onerror() {});
}
<body style="white-space:pre"> IP addresses will be printed here... </body>
答案 1 :(得分:1)
请参阅http://developer.chrome.com/extensions/webRequest.html了解详细信息, 我的代码示例:
// get IP using webRequest
var currentIPList = {};
chrome.webRequest.onCompleted.addListener(
function(info) {
currentIPList[info.url] = info.ip;
currentIPList[info.tabId] = currentIPList[info.tabId] || [];
currentIPList[info.tabId].push(info);
return;
},
{
urls: [],
types: []
},
[]
);
答案 2 :(得分:0)
经过一番搜索,我发现了类似的问题was answered before。 此API无法通过扩展程序访问,但可用于Chrome应用程序:
使用
chrome.system.network.getNetworkInterfaces
。这将返回所有接口的数组及其IP地址。
这是我的示例代码:
chrome.system.network.getNetworkInterfaces(function(interfaces){ console.log(interfaces); });
清单的权限:
"permissions": [ "system.network" ], ...
答案 3 :(得分:-1)
> chrome.system.network.getNetworkInterfaces(function(interfaces){
> console.log(interfaces); });
manifest-permissions:
“权限”: [“system.network”],...
也适合我,它回复:
(4) [{…}, {…}, {…}, {…}]
0 : {address:“xxxx”,name:“en0”,prefixLength:64}
1 : {地址:“192.168.86.100”,姓名:“en0”,前缀长度:24}
2 : {地址:“xxxx”,名称:“awdl0”,prefixLength:64}
3 : {address:“xxxx”,name:“utun0”,prefixLength:64}
长度 : 4