旅游网站开发的需求,建企业网站多少钱,黔西南建设厅网站,安心保险官方网站简介 为了更方便的使用#xff0c;我们将实现一个可以扫描本地连接网络中可用连接的扫描功能#xff0c; 扫描本地连接网络中有哪些连接的设备主机。 环境描述 运行环境: Windows#xff0c; 基于Golang#xff0c; 暂时没有使用什么不可跨平台接口#xff0c; 理论上支持…简介 为了更方便的使用我们将实现一个可以扫描本地连接网络中可用连接的扫描功能 扫描本地连接网络中有哪些连接的设备主机。 环境描述 运行环境: Windows 基于Golang 暂时没有使用什么不可跨平台接口 理论上支持Linux/MacOS 目标终端树莓派DebianOS(主要做用它测试) 实现
package utilsimport (net
)type NetworkInterface struct {Name string // interface nameIPv4 stringIPv6 string
}func GetLocalActivityNetworkInterfaces() ([]NetworkInterface, error) {var (networkInterfaces make([]NetworkInterface, 0)tempNetworkInterface NetworkInterfaceerr errorinterfaces []net.InterfacetempAddrs []net.Addr)interfaces, err net.Interfaces()if err ! nil {return nil, err}for _, iface : range interfaces {//fmt.Println(ifaceName: , iface.Name, , flags: , iface.Flags)// 过滤掉蓝牙和未连接的网络接口if !isActivityNetwork(iface.Flags) {continue}tempNetworkInterface.Name iface.NametempAddrs, err iface.Addrs()if err ! nil {continue}for _, addr : range tempAddrs {// 只处理IP地址if ipnet, ok : addr.(*net.IPNet); ok !ipnet.IP.IsLoopback() {if ipnet.IP.To4() ! nil {tempNetworkInterface.IPv4 ipnet.IP.String()} else if ipnet.IP.To16() ! nil {tempNetworkInterface.IPv6 ipnet.IP.String()}}}networkInterfaces append(networkInterfaces, tempNetworkInterface)}return networkInterfaces, nil
}func isActivityNetwork(flags net.Flags) bool {return !isActivityNetworkUnnecessary(flags) isActivityNetworkNecessary(flags)
}func isActivityNetworkNecessary(flags net.Flags) bool {var fliterFlags []net.Flags{net.FlagUp, net.FlagRunning, net.FlagBroadcast, net.FlagMulticast,}for _, flg : range fliterFlags {if 0 (flg flags) {return false}}return true
}func isActivityNetworkUnnecessary(flags net.Flags) bool {var fliterFlags []net.Flags{net.FlagPointToPoint, net.FlagLoopback,}for _, flg : range fliterFlags {if 0 ! (flg flags) {return true}}return false
}
测试用例
package utilsimport (fmttesting
)func TestGetLocalActivityNetworkInterfaces(t *testing.T) {var interfaces, err GetLocalActivityNetworkInterfaces()if nil ! err {fmt.Println(get lcoal activity network fail, , err.Error())return}for _, intf : range interfaces {fmt.Printf(InterfaceName: %s, IPv4: %s, IPv6: %s.\n, intf.Name, intf.IPv4, intf.IPv6)}}
代码源
https://gitee.com/grayhsu/ssh_remote_access
其他
参考