我正在尝试使用JavaScript查找一些代码示例来查询STUN服务器以获取我的公共IP和端口。也许在
使用服务器虽然这里解释了STUN规范http://www.ietf.org/rfc/rfc3489.txt(这是一篇很长的文档,显然我不希望你阅读它),但我一直找不到任何代码示例,这将使我的生活更轻松。像
这样的东西function getMyIPAndPort() {
//query stun server for it
}
谢谢
答案 0 :(得分:2)
很晚才回答。看看这个迷你项目:https://diafygi.github.io/webrtc-ips/
它确实为您提供了IP,但似乎没有给出端口。但是,如果你看一下这些行://match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
var ip_addr = ip_regex.exec(candidate)[1];
似乎他们删除了端口。我不确定,但你可以用它来发现。
答案 1 :(得分:1)
我还检查了项目(https://diafygi.github.io/webrtc-ips),即使它是一个我不太喜欢的精彩剧本。我的意思是,原因是它假设哪些IP是公共的和私有的。如果IP不是10 / 8,172.16 / 12或192.168 / 16,则它是公共IPv4。这并非总是如此。您可以(不幸的是)在您的LAN中具有其他范围的IPv4地址并对其进行NAT。 这个想法是通过STUN服务器获取IP地址返回,而不是假设它。
此致
答案 2 :(得分:0)
您可以同时获取本地IP和外部IP
function determineIps() {
const pc = new RTCPeerConnection({ iceServers: [ {urls: 'stun:stun.l.google.com:19302'} ] });
pc.createDataChannel('');
pc.createOffer().then(offer => pc.setLocalDescription(offer))
pc.onicecandidate = (ice) => {
if (!ice || !ice.candidate || !ice.candidate.candidate) {
console.log("all done.");
pc.close();
return;
}
let split = ice.candidate.candidate.split(" ");
if (split[7] === "host") {
console.log(`Local IP : ${split[4]}`);
} else {
console.log(`External IP : ${split[4]}`);
}
};
}
determineIps();