
在日常的网络开发或系统管理中,获取本机的 IP 地址是一个非常常见的需求。通常情况下,我们可以通过手动查看网络设置或使用一些命令行工具来获取 IP 地址。然而,在某些情况下,我们需要以编程的方式自动获取 IP 地址,比如在网络应用程序中动态显示 IP 地址,或者在某些系统管理脚本中需要获取 IP 地址信息。
本文将介绍如何使用不同的编程语言和方法来自动获取内网 IP 地址,并提供相应的示例代码。
在 JavaScript 中,可以使用 RTCPeerConnection 接口来获取内网 IP 地址。这个接口原本是用于 WebRTC 技术的,但也可以用于获取网络信息。下面是一个示例代码:
function getInternalIpAddress() {
return new Promise((resolve, reject) => {
const pc = new RTCPeerConnection({
// 配置 STUN 服务器
iceServers: [
{
urls: 'stun:stun.l.google.com:19302'
}
]
});
pc.createDataChannel('');
pc.createOffer(pc.setLocalDescription.bind(pc), reject);
pc.onicecandidate = event => {
if (event.candidate) {
const ip = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(event.candidate.candidate)[1];
// 判断 IP 是否为内网 IP
if (
ip.startsWith('10.') ||
ip.startsWith('172.') ||
ip.startsWith('192.') ||
ip.startsWith('169.254.')
) {
resolve(ip);
}
}
};
setTimeout(() => {
reject(new Error('获取内网 IP 地址超时'));
}, 3000);
});
}
// 调用函数获取内网 IP 地址
getInternalIpAddress().then(ip => {
console.log('内网 IP 地址:', ip);
}).catch(err => {
console.error('获取内网 IP 地址失败:', err);
});
在 Python 中,可以使用 socket 模块来获取内网 IP 地址。下面是一个示例代码:
import socket
def get_internal_ip_address():
try:
# 创建 UDP 套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 连接到一个公共的 IP 地址,不会实际发送数据
s.connect(('8.8.8.8', 80))
# 获取本地 IP 地址
internal_ip = s.getsockname()[0]
s.close()
return internal_ip
except:
return '无法获取内网 IP 地址'
# 调用函数获取内网 IP 地址
internal_ip = get_internal_ip_address()
print('内网 IP 地址:', internal_ip)
在 Java 中,可以使用 InetAddress 类来获取内网 IP 地址。下面是一个示例代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InternalIpAddress {
public static String getInternalIpAddress() {
try {
// 获取所有网络接口
InetAddress[] allIps = InetAddress.getAllByName(InetAddress.getLocalHost().getCanonicalHostName());
for (InetAddress ip : allIps) {
// 判断 IP 是否为内网 IP
if (!ip.isLoopbackAddress() && !ip.isAnyLocalAddress() && !ip.isMulticastAddress() && !ip.isSiteLocalAddress()) {
String ipAddress = ip.getHostAddress();
if (ipAddress.startsWith("10.") || ipAddress.startsWith("172.") || ipAddress.startsWith("192.")) {
return ipAddress;
}
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "无法获取内网 IP 地址";
}
public static void main(String[] args) {
String internalIp = getInternalIpAddress();
System.out.println("内网 IP 地址: " + internalIp);
}
}
在 Go 语言中,可以使用 net 包来获取内网 IP 地址。下面是一个示例代码:
package main
import (
"fmt"
"net"
)
func getInternalIpAddress() (string, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return "", err
}
for _, address := range addrs {
// 检查 IP 地址是否为内网 IP
if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
if ipNet.IP.IsPrivate() {
return ipNet.IP.String(), nil
}
}
}
}
return "", fmt.Errorf("无法获取内网 IP 地址")
}
func main() {
internalIp, err := getInternalIpAddress()
if err != nil {
fmt.Println("获取内网 IP 地址失败:", err)
return
}
fmt.Println("内网 IP 地址:", internalIp)
}
在本文中,我们介绍如何使用不同的编程语言和方法来自动获取内网 IP 地址。无论是 JavaScript、Python、Java 还是 Go 语言,都提供相应的方法和代码示例来实现这个功能。通过这些方法,我们可以在网络应用程序或系统管理脚本中动态获取 IP 地址信息,从而更好地支持业务需求。这些方法也可以作为参考,帮助开发者在其他编程语言或框架中实现类似的功能。