feat(netx): 自 go-hua/common 迁入本机网络信息工具并独立成包
- 枚举 IPv4 地址与 MAC 地址(过滤回环与虚拟网卡),附测试、例程与 README
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
// netx 包示例:本机网络信息(IPv4 地址列表、MAC 地址列表)
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.zeroonesoft.cn/golib/zogo/netx"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ips, err := netx.GetLocalIp()
|
||||||
|
fmt.Println("本机 IPv4:", ips, "错误:", err)
|
||||||
|
|
||||||
|
macs, err := netx.GetLocalMac()
|
||||||
|
fmt.Println("本机 MAC:", macs, "错误:", err)
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# netx
|
||||||
|
|
||||||
|
本机网络信息:枚举 IPv4 地址(不含回环)与 MAC 地址(跳过无硬件地址的虚拟网卡)。
|
||||||
|
|
||||||
|
> 迁移自 go-hua/common(原 net.go)。
|
||||||
|
|
||||||
|
## 用法
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "git.zeroonesoft.cn/golib/zogo/netx"
|
||||||
|
|
||||||
|
ips, err := netx.GetLocalIp() // []string{"192.168.1.100", ...}
|
||||||
|
macs, err := netx.GetLocalMac() // []string{"aa-bb-cc-dd-ee-ff", ...}
|
||||||
|
```
|
||||||
|
|
||||||
|
完整可运行例程:[examples/netx/main.go](../examples/netx/main.go)
|
||||||
|
|
||||||
|
## 注意
|
||||||
|
|
||||||
|
- 多网卡机器返回列表顺序即系统接口顺序,业务侧自行选择。
|
||||||
|
- `NetBufferSize` 为历史遗留常量(0x1000),与本包函数无关联。
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
// Package netx 本机网络信息:枚举 IPv4 地址与 MAC 地址(跳过回环与无硬件地址的虚拟网卡)。
|
||||||
|
package netx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
const NetBufferSize = 0x1000
|
||||||
|
|
||||||
|
// GetLocalIp 获取本机所有 IPv4 地址(不含回环)
|
||||||
|
func GetLocalIp() ([]string, error) {
|
||||||
|
addrList, err := net.InterfaceAddrs()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ipList := make([]string, 0)
|
||||||
|
for _, address := range addrList {
|
||||||
|
// 检查ip地址判断是否回环地址
|
||||||
|
if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
|
||||||
|
if ipNet.IP.To4() != nil {
|
||||||
|
ipList = append(ipList, ipNet.IP.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ipList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLocalMac 获取本机的MAC地址(跳过无硬件地址的虚拟网卡)
|
||||||
|
func GetLocalMac() ([]string, error) {
|
||||||
|
macList := make([]string, 0)
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, inter := range interfaces {
|
||||||
|
mac := inter.HardwareAddr.String()
|
||||||
|
if mac == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
macList = append(macList, mac)
|
||||||
|
}
|
||||||
|
return macList, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package netx
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestGetLocalIpAndMac(t *testing.T) {
|
||||||
|
ips, err := GetLocalIp()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("GetLocalIp: %v", err)
|
||||||
|
}
|
||||||
|
if len(ips) == 0 {
|
||||||
|
t.Log("本机无 IPv4 地址(CI 环境可能出现)")
|
||||||
|
}
|
||||||
|
|
||||||
|
macs, err := GetLocalMac()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("GetLocalMac: %v", err)
|
||||||
|
}
|
||||||
|
if len(macs) == 0 {
|
||||||
|
t.Log("本机未采集到 MAC 地址(CI 环境可能出现)")
|
||||||
|
}
|
||||||
|
// 不应包含空串(无硬件地址的虚拟网卡已被过滤)
|
||||||
|
for _, m := range macs {
|
||||||
|
if m == "" {
|
||||||
|
t.Error("MAC 列表不应包含空串")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user