有没有更严谨一些的方法
时间: 2023-11-16 13:12:08 浏览: 40
更严谨一些的方法是通过判断 IP 地址是否在内网 IP 地址段之内来确定当前环境是内网还是外网。
IPv4 的内网 IP 地址段通常有三个,分别是:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
IPv6 的内网地址一般以 `fd` 开头,如 `fd00::/8`。
以下是一段示例代码,可以判断当前环境是内网还是外网:
```javascript
function isInternalIP(ip) {
var ipArr = ip.split('.');
var ipNum = (parseInt(ipArr[0], 10) << 24) | (parseInt(ipArr[1], 10) << 16) | (parseInt(ipArr[2], 10) << 8) | parseInt(ipArr[3], 10);
var internalIPs = [
[0x0A000000, 0xFF000000], // 10.0.0.0/8
[0xAC100000, 0xFFF00000], // 172.16.0.0/12
[0xC0A80000, 0xFFFF0000], // 192.168.0.0/16
[0xFD000000, 0xFF000000], // fd00::/8
];
for (var i = 0; i < internalIPs.length; i++) {
var range = internalIPs[i];
if ((ipNum & range[1]) === range[0]) {
return true;
}
}
return false;
}
var ip = '';
var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection) {
var rtc = new RTCPeerConnection({ iceServers: [] });
rtc.createDataChannel('', { reliable: false });
rtc.onicecandidate = function (evt) {
if (evt.candidate && evt.candidate.candidate) {
var candidate = evt.candidate.candidate;
ip = candidate.split(' ')[4];
if (isInternalIP(ip)) {
console.log('当前环境为内网环境');
} else {
console.log('当前环境为外网环境');
}
}
};
rtc.createOffer(function (offerDesc) {
rtc.setLocalDescription(offerDesc);
}, function (e) {
console.warn(e);
});
}
```
该代码通过创建一个 RTCPeerConnection 对象,利用 WebRTC 技术获取本地 IP 地址,然后判断是否在内网 IP 地址段之内。其中,`isInternalIP()` 函数用于判断 IP 地址是否为内网 IP 地址,`RTCpeerConnection` 对象用于获取本地 IP 地址。在获取到本地 IP 地址后,调用 `isInternalIP()` 函数判断当前环境是内网还是外网。该方法的优点是比较准确,但是需要使用 WebRTC 技术,而且不同浏览器的实现方式有所不同。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)