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

其他

参考

相关推荐
大懒猫软件1 小时前
如何有效使用Python爬虫将网页数据存储到Word文档
爬虫·python·自动化·word
霍格沃兹测试开发学社测试人社区2 小时前
人工智能在音频、视觉、多模态领域的应用
软件测试·人工智能·测试开发·自动化·音视频
小徐同学14183 小时前
BGP边界网关协议(Border Gateway Protocol)路由聚合详解
运维·服务器·网络·网络协议·信息与通信·bgp
阿常113 小时前
计算机网络——OSI和TCP/IP模型
网络·tcp/ip·计算机网络
费4 小时前
1、云计算
网络·云计算
m0_748246614 小时前
(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)
自动化·jenkins·maven
谁在夜里看海.5 小时前
【Linux-网络】初识计算机网络 & Socket套接字 & TCP/UDP协议(包含Socket编程实战)
linux·运维·服务器·网络·计算机网络
马浩同学6 小时前
【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程
c语言·网络·单片机·mcu·tcp/ip
孤寂大仙v6 小时前
【Linux】进程地址空间与虚拟地址空间
linux·运维·服务器·网络·redis
Unique_yt7 小时前
1.25 实现一个终端的功能
c语言·开发语言·网络