Golang实现一个批量自动化执行树莓派指令的软件(7)辅助模块-本地活动网络

简介

为了更方便的使用,我们将实现一个可以扫描本地连接网络中可用连接的扫描功能, 扫描本地连接网络中有哪些连接的设备主机。

环境描述

运行环境 : Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS
目标终端:树莓派DebianOS(主要做用它测试)

实现

go 复制代码
package utils

import (
	"net"
)

type NetworkInterface struct {
	Name string // interface name
	IPv4 string
	IPv6 string
}

func GetLocalActivityNetworkInterfaces() ([]NetworkInterface, error) {
	var (
		networkInterfaces    = make([]NetworkInterface, 0)
		tempNetworkInterface NetworkInterface
		err                  error
		interfaces           []net.Interface
		tempAddrs            []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.Name

		tempAddrs, 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
}

测试用例

go 复制代码
package utils

import (
	"fmt"
	"testing"
)

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

其他

参考

相关推荐
weixin_416667968 小时前
【无标题】
运维·服务器·网络
予昊8 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
上海云盾-小余10 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
戴西软件10 小时前
戴西iDWS.3DViz Suite数据轻量化可视化软件,从传统桌面软件向云端协同的重大突破
大数据·运维·网络·人工智能·机器学习·3d
芯盾时代10 小时前
《金融业网络安全管理办法(征求意见稿)》全条款深度拆解(三)
网络·安全·网络安全
米饭不加菜10 小时前
ESP-01S通过TCP直接与手机建立通信
网络·tcp/ip·智能手机
闲云野鹤在人间11 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack
xx~t11 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
代码方舟12 小时前
零信任架构实战:基于天远车辆估值构建自动化二手车评估网关
运维·人工智能·架构·自动化
国科安芯13 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构