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

news/2024/9/23 1:51:51/

简介

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

环境描述

运行环境: 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 ("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

其他

参考


http://www.ppmy.cn/news/1447242.html

相关文章

1.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前置课程JavaScript,看这一篇就够了

上一章我们讲了HTML的知识,那么我们现在要来学习,JavaScript 那么首先我们要知道JavaScript写在哪里。 JavaScript核心语法 js书写的位置 1、写在页面中的script标签下 只有在代码与页面有强关联的情况下才会写在页面里 2、写在指定的js文件下通过…

Oracle索引组织表与大对象平滑迁移至OceanBase的实施方案

作者简介:严军(花名吉远),十年以上专注于数据库存储领域,精通Oracle、Mysql、OceanBase,对大数据、分布式、高并发、高性能、高可用有丰富的经验。主导过蚂蚁集团核心系统数据库升级,数据库LDC单元化多活项目&#xff…

第二章:计算机系统基础知识之多媒体

多媒体概述 媒体(Media)是承载信息的载体,即信息的表现形式(或者传播形式),如文字、声音、图像、动画和视频等。按照ITU-T建议的定义,媒体可分为感觉媒体、表示媒体、显示媒体、存储媒体和传输媒体。 感觉媒体(Perception Medium)&#xff0…

一个好用的MQTT客户端软件

软件功能如下,实现的协议版本是 3.1.1 仅实现了常用的 CONNECT , PUBLISH , SUBSCRIBE 及相应的应答报文。支持以 Hex 格式显示接收的原始报文(方便初学者学习)。支持所有字段的自定义配置。支持保存与加载配置文件。 软件界面如下所示&…

【AI大模型】用指令层级的方法提高LLM的安全性

本文参考论文为: Eric Wallace, Kai Xiao, Reimar Leike, Lilian Weng, Johannes Heidecke, Alex Beutel. The Instruction Hierarchy: Training LLMs to Prioritize Privileged Instructions. arXiv:2404.13208v1, 2024. https://doi.org/10.48550/arXiv.2404.132…

IDEA 中 git fetch 验证报错 The provided password or token is incorrect

参考链接: 【GitLab】-HTTP Basic: Access denied.remote:You must use a personal access token_http basic: access denied. the provided password o-CSDN博客 idea使用gitLab报错:remote: HTTP Basic: Access denied_idea remote: http basic: acc…

从零开始学C语言系列之第三章《define》

往期回顾 【第一章】《认识C语言》 【第二章】C语言概述及基本知识1 【第二章】C语言概述及基本知识2 【第三章】字符串和格式化输入/ 输出 【第三章】 printf 【第三章】 scanf 【第三章】 putchar 【第三章】 getchar 【第三章】 sizeof 【第三章】 strlen 文章目录 往期回顾…

C# 和 Qt 相比的一些优势

C# 和 Qt 都是流行的软件开发工具,它们各自具有不同的优势,适用于不同的开发场景。以下是 C# 和 Qt 相比的一些优势。相比之下,Qt 也有其独特的优势,特别是在跨平台 GUI 应用程序开发方面。然而,C# 的这些优势使得它在…