手机版 收藏 导航

如何自动获取内网ip地址

原创   www.link114.cn   2023-07-06 14:47:32

如何自动获取内网ip地址

在日常的网络开发或系统管理中,获取本机的 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 地址信息,从而更好地支持业务需求。这些方法也可以作为参考,帮助开发者在其他编程语言或框架中实现类似的功能。