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

简介

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

环境描述

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

实现

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
}

测试用例

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. TCP协议是安全的吗?

    2024-04-28 05:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 05:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 05:52:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 05:52:04       20 阅读

热门阅读

  1. Python项目开发实战:动物分拣器的实现

    2024-04-28 05:52:04       11 阅读
  2. 揭密 scaling laws

    2024-04-28 05:52:04       14 阅读
  3. 1Panel应用推荐: frp内网穿透工具

    2024-04-28 05:52:04       43 阅读
  4. Linux系统及工具的使用

    2024-04-28 05:52:04       43 阅读
  5. Vue 3 快速上手指南(第一期)

    2024-04-28 05:52:04       12 阅读
  6. 在C语言中,有哪些常见的编码错误应该避免?

    2024-04-28 05:52:04       10 阅读
  7. 编辑器,编译器,IDE的区别

    2024-04-28 05:52:04       15 阅读
  8. Linux: Netlink 简介

    2024-04-28 05:52:04       15 阅读
  9. 聊聊redisson的RRateLimiter

    2024-04-28 05:52:04       25 阅读
  10. static变量获取nacos配置文件值

    2024-04-28 05:52:04       14 阅读