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

其他

参考

相关推荐
小小、码农22 分钟前
Linux进程概念
linux·服务器·网络
JJJennie77725 分钟前
当AI开始学会欺骗
网络·人工智能
Wang's Blog7 小时前
Go-Zero 项目开发47:自研微服务框架的必要性与核心结构设计
开发语言·微服务·golang
专业贴准9 小时前
苏州SMT供料器设备选型分析:本地主流自动化企业技术特点与行业趋势
人工智能·自动化·制造
技术深耕者10 小时前
AI Agent从演示到生产:企业进入“自动化层”时代
运维·人工智能·自动化
黑桃小柒710 小时前
小,最终显示为TCP WINDOW FULL,TCP ZeroWindow。 仔细分析了下LWIP源码,还以为是内存管理出了问题,跟 ...
网络·网络协议·tcp/ip
APItesterCris12 小时前
Open Claw 实战教程:5 分钟搭建京东商品自动化监控与数据分析系统
大数据·运维·数据库·数据仓库·自动化
网络研究院12 小时前
LastPass 发布紧急安全预警:针对主密码的活跃网络钓鱼攻击正在进行中
网络·安全·黑客·攻击·漏洞·风险·钓鱼
de之梦-御风13 小时前
【工业自动化平台】 工程设计-项目分层目录设计(1)
自动化·.net
名字还没想好☜13 小时前
Go 用 bufio.Scanner 读大文件踩坑:默认 64KB 行上限、Buffer 扩容与按 Token 切分
开发语言·后端·golang·go