eth

package
v1.8.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 9, 2026 License: Apache-2.0 Imports: 14 Imported by: 0

README

Eth - 网络接口管理模块

📋 功能概述

Eth模块提供了完整的网络接口管理功能,支持获取网卡信息、网关配置、DNS设置等网络基础设施信息,支持IPv4/IPv6双栈和跨平台操作。

✨ 核心功能

🔌 网卡信息管理
  • 多网卡支持: 获取系统中所有网络接口信息
  • IPv4/IPv6双栈: 完整支持IPv4和IPv6地址信息
  • 详细配置: MAC地址、子网掩码、网关、DNS等详细信息
  • 接口状态: 检测网卡启用状态和连接状态
🌐 网络配置获取
  • 默认接口: 自动获取系统默认网络接口
  • 网关信息: 获取指定网卡的网关配置
  • DNS服务器: 获取网卡配置的DNS服务器列表
  • 子网信息: 计算和获取网段子网信息
🔧 跨平台支持
  • Windows: 支持Windows系统的网络配置获取
  • Linux: 支持Linux系统的网络接口管理
  • macOS: 支持macOS系统的网络配置
  • 自动适配: 根据操作系统自动选择合适的获取方法

📁 文件结构

struct.go - 数据结构定义
// Eth - 网卡信息结构体
type Eth struct {
    Info  []Info `json:"info"`  // 网卡信息列表
    Err   error  `json:"err"`   // 错误信息
    Debug bool   `json:"debug"` // 调试模式
}

// Info - 网卡详细信息
type Info struct {
    Name    string    `json:"name"`     // 网卡名称
    Mac     string    `json:"mac"`      // MAC地址
    Ip      []IpInfo  `json:"ip"`       // IPv4地址列表
    Ip6Info []Ip6Info `json:"ip6Info"`  // IPv6地址列表
    Sub     net.IP    `json:"sub"`      // 网段
    Mask    net.IP    `json:"mask"`     // 子网掩码
    DnsList []net.IP  `json:"dnsList"`  // DNS列表
    Version int       `json:"version"`  // IP版本
}

// IpInfo - IPv4信息
type IpInfo struct {
    Ip      net.IP `json:"ip"`      // IP地址
    Mask    net.IP `json:"mask"`    // 子网掩码
    MaskInt int    `json:"maskInt"` // 掩码长度
    Gw      net.IP `json:"gw"`      // 网关
}

// Ip6Info - IPv6信息
type Ip6Info struct {
    Ip      net.IP `json:"ip"`      // IPv6地址
    Mask    net.IP `json:"mask"`    // IPv6掩码
    MaskInt int    `json:"maskInt"` // 掩码长度
    ScopeId int    `json:"scopeId"` // 作用域ID
    Gw      net.IP `json:"gw"`      // IPv6网关
}
info.go - 网卡信息获取
// 获取所有网卡信息
func (e *Eth) GetEthListInfo()

// 获取指定网卡的IPv4信息
func (e *Eth) GetEthInfoV4(eth string) (*Info, error)

// 获取指定网卡的IPv6信息
func (e *Eth) GetEthInfoV6(eth string) (*Info, error)

// 获取指定网卡的完整信息
func (e *Eth) GetEthInfo(eth string) (*Info, error)

// 获取系统所有网卡名称列表
func (e *Eth) GetEthList() []string
gw.go - 网关信息管理
// Gateway - 网关信息结构体
type Gateway struct {
    Interface string // 网卡名称
    IP        net.IP // 网关IP地址
}

// 获取指定网卡的网关信息
func (e *Eth) GetGateway(eth string, ip net.IP) (*Gateway, error)

// 内部网关获取方法
func (e *Eth) getGatewayIP(eth string, ip net.IP) (net.IP, error)
dns.go - DNS配置管理
// 获取指定网卡的DNS服务器列表
func (e *Eth) GetEthDNS(eth string) ([]net.IP, error)

// Windows系统DNS获取
func (e *Eth) getWindowsDNS(eth string) ([]net.IP, error)

// Unix/Linux/macOS系统DNS获取
func (e *Eth) getUnixDNS() ([]net.IP, error)
default_ip.go - 默认接口管理
// 获取本机默认网络接口的IP信息
func GetDefaultIPInfo() (*Info, error)

// 获取系统默认网络接口
func (e *Eth) GetDefaultInterface() (net.Interface, error)

🚀 使用示例

基本网卡信息获取
package main

import (
    "fmt"
    "log"
    "gitee.com/liumou_site/gns/eth"
)

func main() {
    // 创建Eth实例
    e := eth.NewEth(false)
    
    // 获取所有网卡信息
    e.GetEthListInfo()
    if e.Err != nil {
        log.Fatal(e.Err)
    }
    
    // 遍历所有网卡信息
    for _, info := range e.Info {
        fmt.Printf("=== 网卡: %s ===\n", info.Name)
        fmt.Printf("MAC地址: %s\n", info.Mac)
        fmt.Printf("IP地址版本: %d\n", info.Version)
        
        // 显示IPv4信息
        if len(info.Ip) > 0 {
            fmt.Printf("IPv4地址:\n")
            for _, ipInfo := range info.Ip {
                fmt.Printf("  IP: %s, 掩码: %s (%d), 网关: %s\n",
                    ipInfo.Ip, ipInfo.Mask, ipInfo.MaskInt, ipInfo.Gw)
            }
        }
        
        // 显示IPv6信息
        if len(info.Ip6Info) > 0 {
            fmt.Printf("IPv6地址:\n")
            for _, ip6Info := range info.Ip6Info {
                fmt.Printf("  IPv6: %s, 掩码: %s (%d), 网关: %s\n",
                    ip6Info.Ip, ip6Info.Mask, ip6Info.MaskInt, ip6Info.Gw)
            }
        }
        
        // 显示DNS信息
        if len(info.DnsList) > 0 {
            fmt.Printf("DNS服务器:\n")
            for _, dns := range info.DnsList {
                fmt.Printf("  %s\n", dns)
            }
        }
        
        fmt.Println()
    }
}
获取指定网卡信息
// 获取指定网卡的详细信息
func getSpecificInterface() {
    e := eth.NewEth(false)
    
    // 获取eth0网卡信息
    info, err := e.GetEthInfo("eth0")
    if err != nil {
        fmt.Printf("获取网卡信息失败: %v\n", err)
        return
    }
    
    fmt.Printf("网卡名称: %s\n", info.Name)
    fmt.Printf("MAC地址: %s\n", info.Mac)
    fmt.Printf("网段: %s\n", info.Sub)
    fmt.Printf("掩码: %s\n", info.Mask)
    
    if len(info.Ip) > 0 {
        fmt.Printf("主IP: %s\n", info.Ip[0].Ip)
    }
}
获取网关信息
// 获取网卡的网关配置
func getGatewayInfo() {
    e := eth.NewEth(false)
    
    // 首先获取默认网络接口
    defaultInfo, err := eth.GetDefaultIPInfo()
    if err != nil {
        fmt.Printf("获取默认接口失败: %v\n", err)
        return
    }
    
    // 获取该接口的网关信息
    gateway, err := e.GetGateway(defaultInfo.Name, defaultInfo.Ip[0].Ip)
    if err != nil {
        fmt.Printf("获取网关信息失败: %v\n", err)
        return
    }
    
    fmt.Printf("默认网关:\n")
    fmt.Printf("  接口: %s\n", gateway.Interface)
    fmt.Printf("  IP: %s\n", gateway.IP)
}
获取DNS服务器
// 获取网卡的DNS配置
func getDNSInfo() {
    e := eth.NewEth(false)
    
    // 获取默认接口信息
    defaultInfo, err := eth.GetDefaultIPInfo()
    if err != nil {
        fmt.Printf("获取默认接口失败: %v\n", err)
        return
    }
    
    // 获取DNS服务器
    dnsList, err := e.GetEthDNS(defaultInfo.Name)
    if err != nil {
        fmt.Printf("获取DNS信息失败: %v\n", err)
        return
    }
    
    fmt.Printf("DNS服务器列表:\n")
    for i, dns := range dnsList {
        fmt.Printf("  DNS%d: %s\n", i+1, dns)
    }
}
获取默认网络接口
// 获取系统默认网络接口信息
func getDefaultInterface() {
    // 使用便捷函数获取默认IP信息
    info, err := eth.GetDefaultIPInfo()
    if err != nil {
        fmt.Printf("获取默认接口失败: %v\n", err)
        return
    }
    
    fmt.Printf("默认网络接口信息:\n")
    fmt.Printf("  网卡名称: %s\n", info.Name)
    fmt.Printf("  MAC地址: %s\n", info.Mac)
    
    if len(info.Ip) > 0 {
        fmt.Printf("  主IP地址: %s\n", info.Ip[0].Ip)
        fmt.Printf("  子网掩码: %s\n", info.Ip[0].Mask)
        fmt.Printf("  掩码长度: /%d\n", info.Ip[0].MaskInt)
    }
    
    // 获取网关信息
    e := eth.NewEth(false)
    gateway, err := e.GetGateway(info.Name, info.Ip[0].Ip)
    if err == nil {
        fmt.Printf("  网关地址: %s\n", gateway.IP)
    }
}
跨平台DNS获取
// 跨平台DNS获取示例
func crossPlatformDNS() {
    e := eth.NewEth(false)
    
    // 获取所有网卡
    ethList := e.GetEthList()
    
    for _, ethName := range ethList {
        fmt.Printf("=== 网卡: %s ===\n", ethName)
        
        // 获取DNS信息
        dnsList, err := e.GetEthDNS(ethName)
        if err != nil {
            fmt.Printf("获取DNS失败: %v\n", err)
            continue
        }
        
        if len(dnsList) > 0 {
            fmt.Printf("DNS服务器:\n")
            for _, dns := range dnsList {
                fmt.Printf("  %s\n", dns)
            }
        } else {
            fmt.Printf("未配置DNS服务器\n")
        }
        fmt.Println()
    }
}
IPv6信息获取
// 获取IPv6网络信息
func getIPv6Info() {
    e := eth.NewEth(false)
    
    // 获取所有网卡信息
    e.GetEthListInfo()
    if e.Err != nil {
        fmt.Printf("获取网卡信息失败: %v\n", e.Err)
        return
    }
    
    for _, info := range e.Info {
        if len(info.Ip6Info) > 0 {
            fmt.Printf("=== %s IPv6信息 ===\n", info.Name)
            for _, ip6 := range info.Ip6Info {
                fmt.Printf("IPv6地址: %s\n", ip6.Ip)
                fmt.Printf("前缀长度: /%d\n", ip6.MaskInt)
                fmt.Printf("作用域ID: %d\n", ip6.ScopeId)
                if !ip6.Gw.IsUnspecified() {
                    fmt.Printf("IPv6网关: %s\n", ip6.Gw)
                }
            }
        }
    }
}

🔧 配置选项

调试模式
// 启用调试模式
e := eth.NewEth(true)  // 开启调试日志

// 禁用调试模式
e := eth.NewEth(false) // 关闭调试日志
错误处理
// 获取网卡信息时检查错误
e := eth.NewEth(false)
e.GetEthListInfo()
if e.Err != nil {
    log.Printf("获取网卡信息时发生错误: %v", e.Err)
    return
}

📊 数据结构说明

Info 结构体详解
type Info struct {
    Name    string    // 网卡名称(如"eth0", "en0", "以太网")
    Mac     string    // MAC地址(如"00:11:22:33:44:55")
    Ip      []IpInfo  // IPv4地址信息列表
    Ip6Info []Ip6Info // IPv6地址信息列表
    Sub     net.IP    // 网络号(如"192.168.1.0")
    Mask    net.IP    // 子网掩码(如"255.255.255.0")
    DnsList []net.IP  // DNS服务器IP地址列表
    Version int       // IP版本号(4或6)
}
IpInfo 结构体详解
type IpInfo struct {
    Ip      net.IP // IPv4地址(如"192.168.1.100")
    Mask    net.IP // 子网掩码(如"255.255.255.0")
    MaskInt int    // 掩码长度(如24表示/24网络)
    Gw      net.IP // 默认网关IP地址
}

⚠️ 注意事项

  1. 权限要求:

    • 大部分功能不需要特殊权限
    • 某些系统命令可能需要管理员权限
  2. 操作系统差异:

    • Windows: 使用ipconfigroute命令
    • Linux: 读取/proc/net/route/etc/resolv.conf
    • macOS: 使用netstat命令
  3. 网络环境:

    • 无线网卡可能显示多个接口
    • 虚拟网卡也会被检测到
    • 回环接口(127.0.0.1)会被包含
  4. 性能考虑:

    • 频繁调用可能影响性能
    • 建议缓存结果而不是重复获取
  5. 错误处理:

    • 始终检查返回的错误信息
    • 网络配置变更后需要重新获取

🔗 相关模块

  • ip - IP地址处理和验证
  • ping - 网络连通性检测
  • detect - 综合网络检测

📖 相关文档

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FormatIPv4WithMask added in v1.6.0

func FormatIPv4WithMask(ip net.IP, maskInt int) string

FormatIPv4WithMask 格式化IPv4地址和掩码

参数:

ip: IPv4地址
maskInt: 掩码长度(如24表示255.255.255.0)

返回值:

string: 格式化后的IP和掩码,例如"192.168.1.1/255.255.255.0"

func GetDefaultIPv4 added in v1.6.0

func GetDefaultIPv4() (net.IP, error)

GetDefaultIPv4 获取本机默认网络接口的IPv4地址

返回值:

net.IP - 默认网卡的IPv4地址
error - 如果发生错误,则返回错误信息,否则返回nil

func GetDefaultIPv4String added in v1.6.0

func GetDefaultIPv4String() (string, error)

GetDefaultIPv4String 获取本机默认网络接口的IPv4地址字符串表示

返回值:

string - 默认网卡的IPv4地址字符串
error - 如果发生错误,则返回错误信息,否则返回nil

func GetDefaultNetworkInfo added in v1.6.0

func GetDefaultNetworkInfo() (map[string]interface{}, error)

GetDefaultNetworkInfo 获取本机默认网络接口的完整网络信息

返回值:

map[string]interface{} - 包含网卡名称、IP地址、MAC地址、子网掩码、网关、DNS等信息的映射
error - 如果发生错误,则返回错误信息,否则返回nil

func IsPrivateIP added in v1.6.0

func IsPrivateIP(ip net.IP) bool

IsPrivateIP 检查IP是否为私有IP地址

私有IP地址包括: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 - 169.254.0.0/16 (链路本地地址)

参数:

ip: 要检查的IP地址

返回值:

bool: 如果是私有IP地址返回true,否则返回false

func SliceRemoveValueIP added in v1.5.7

func SliceRemoveValueIP(l []net.IP, value net.IP) []net.IP

SliceRemoveValueIP 从一个 net.IP 切片中移除指定的 IP 地址。 该函数从给定的IP地址切片中移除指定的IP地址,返回一个新的切片,不修改原切片。

参数:

l []net.IP - 原始IP地址切片
value net.IP - 要移除的IP地址

返回值:

[]net.IP - 移除指定IP后的新切片

Types

type Eth

type Eth struct {
	Info  []Info `json:"info"`  // Info 字段是一个 Info 类型的切片,用于存储网卡信息列表。
	Err   error  `json:"err"`   // Err 字段用于存储在获取网卡信息过程中可能发生的错误。
	Debug bool   `json:"debug"` // Debug 字段用于控制是否输出调试信息。
}

Eth 结构体用于封装网卡信息和错误信息。 它包含两个字段:网卡信息列表和错误信息。

func NewEth

func NewEth(debug bool) *Eth

NewEth 创建并初始化一个新的 Eth 实例。 参数:

debug - 指示是否启用调试模式的布尔值。如果为 true,Eth 实例将运行在调试模式下;
        如果为 false,则运行在正常模式下。

返回值:

*eth.Eth - 返回一个指向 eth.Eth 类型的指针,表示初始化后的 Eth 实例。

func (*Eth) CheckGatewayOnline added in v1.6.3

func (e *Eth) CheckGatewayOnline(gwIP net.IP) (bool, float64, error)

CheckGatewayOnline 检查指定网关IP是否在线,并返回丢包率 返回: online(是否在线)、lossRate(丢包率百分比)、err

func (*Eth) GetDefaultGateway added in v1.8.4

func (e *Eth) GetDefaultGateway() (*Gateway, error)

GetDefaultGateway 获取系统默认网关 返回: Gateway结构体指针和错误信息

func (*Eth) GetDefaultInterface added in v1.6.3

func (e *Eth) GetDefaultInterface() (*net.Interface, error)

GetDefaultInterface 获取当前系统用于连接默认路由的网络接口 该方法通过创建一个虚拟的UDP连接(目标为公共DNS服务器),利用系统路由表确定默认出口网卡 返回: 成功返回网络接口指针,失败返回错误信息

func (*Eth) GetEthDNS

func (e *Eth) GetEthDNS(eth string) ([]net.IP, error)

GetEthDNS 获取以太网的DNS配置。 该方法根据当前操作系统的类型调用相应的DNS获取方法。 参数:

eth - 以太网接口名称。

返回值:

一个net.IP切片,包含DNS服务器地址。
如果操作系统不支持或发生错误,则返回错误。

func (*Eth) GetEthInfo

func (e *Eth) GetEthInfo(eth string) (*Info, error)

GetEthInfo 获取指定网卡的网卡信息

func (*Eth) GetEthInfoV4 added in v1.5.7

func (e *Eth) GetEthInfoV4(eth string) (*Info, error)

GetEthInfoV4 获取指定网卡的IPv4信息。 参数:

eth string - 网卡名称。

返回值:

*Info - 包含网卡信息的结构体指针。
error - 如果发生错误,则返回错误信息,否则返回nil

func (*Eth) GetEthList

func (e *Eth) GetEthList() []string

GetEthList 获取当前系统中所有正在使用的网络接口名称列表。 该函数通过查询系统中的网络接口信息,筛选出所有处于激活状态(即接口标志中包含FlagUp)的网络接口, 并将其名称添加到一个字符串列表中,最后返回该列表。 如果在获取网络接口信息时发生错误,函数将直接返回nil。

func (*Eth) GetEthListInfo

func (e *Eth) GetEthListInfo()

GetEthListInfo 获取所有网卡的信息 该函数通过调用 GetEthList 和 GetEthInfo 方法获取所有网卡的信息。 通过 Info 字段记录所有网卡的信息。

func (*Eth) GetGateway added in v1.6.3

func (e *Eth) GetGateway(eth string) (*Gateway, error)

GetGateway 公开方法,根据网卡名获取网关信息 参数 eth: 网卡名称 返回: Gateway结构体指针和错误信息

type Gateway added in v1.6.3

type Gateway struct {
	Interface string // 网卡名
	IP        net.IP // 网关IP
}

Gateway 结构体,公开属性 表示一个网关信息

type Info

type Info struct {
	Name    string    `json:"name" `   // 网卡名称,例如 eth0
	Mac     string    `json:"mac"`     // 网卡mac,例如 00:00:00:00:00:00
	Ip      []IpInfo  `json:"ip"`      // 网卡ip列表, 例如 ["192.168.1.1"]
	Ip6Info []Ip6Info `json:"ip6Info"` // IPv6基础信息
	Sub     net.IP    `json:"sub"`     // 网段, 例如 192.168.1.0
	Mask    net.IP    `json:"mask"`    // 网卡掩码, 例如 255.255.255.0
	DnsList []net.IP  `json:"dnsList"` // DNS列表
	Version int       `json:"version"` // IP版本, 例如 4
}

func GetDefaultIPInfo added in v1.6.0

func GetDefaultIPInfo() (*Info, error)

GetDefaultIPInfo 获取本机默认网络接口的IP信息

该函数通过以下步骤获取本机默认IP信息: 1. 获取系统默认网络接口 2. 获取该接口的IPv4地址信息

返回值:

*Info - 包含默认网卡信息的结构体指针
error - 如果发生错误,则返回错误信息,否则返回nil

type Ip6Info added in v1.6.0

type Ip6Info struct {
	Ip      net.IP `json:"ip"`      // IPv6地址,例如 2001:db8::1
	Mask    net.IP `json:"mask"`    // IPv6掩码,例如 ffff:ffff:ffff:ffff::
	MaskInt int    `json:"maskInt"` // 掩码长度,例如 64
	ScopeId int    `json:"scopeId"` // IPv6作用域ID
	Gw      net.IP `json:"gw"`      // IPv6网关
}

type IpInfo added in v1.5.6

type IpInfo struct {
	Ip      net.IP `json:"ip"`      // 网卡ip,例如 192.168.1.1
	Mask    net.IP `json:"mask"`    // 网卡掩码,例如 255.255.255.0
	MaskInt int    `json:"maskInt"` // 网卡掩码,例如 24
	Gw      net.IP `json:"gw"`      // 网关, 例如 192.168.1.1
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL