使用fyne做一个桌面ipv4网段计算程序

前言

最近做项目,发现内网环境下基本还是ipv4,但是在网络隔离后,需要开墙,开墙需要计算网段,本来也没什么,手工计算一下就行,但是开墙多了计算也很烦,其实做一个网页工具最合适,但是笔者做了一个桌面工具,免得维护,使用go fyne桌面简单做了一个,可以跨平台。附上我自己ARM mac编译的软件。

demo

go开发环境:包括goproxy ide等,fyne的文档:https://docs.fyne.io/started/quick/

执行go get fyne.io/fyne/v2@latest

最新版本是2.7.2

正常写代码

package main

import (
	"fmt"
	"strconv"
	"strings"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)

// client use, for server not use global var
var ipv4, netmask string

func main() {
	// build ui for window
	demoApp := app.New()
	// window must init for other ui first
	demoWin := demoApp.NewWindow("net-segment")

	// def input and output entry
	// input for ip
	ipv4Entry := widget.NewEntry()
	ipv4Entry.Move(fyne.NewPos(0, 0))
	ipv4Entry.Resize(fyne.NewSize(200, ipv4Entry.MinSize().Height))
	ipv4Entry.SetPlaceHolder("IPv4 Address")
	ipv4Entry.OnChanged = func(s string) {
		ipv4 = s
	}

	// subnet mask
	subNetmaskEntry := widget.NewEntry()
	subNetmaskEntry.SetPlaceHolder("SubnetMask")
	subNetmaskEntry.OnChanged = func(s string) {
		netmask = s
	}

	// def net segment for output
	netSegmentEntry := widget.NewEntry()
	netSegmentEntry.SetPlaceHolder("NetSegment")
	netSegmentEntry.OnChanged = func(s string) {
		fmt.Println(s)
	}

	//def button for calc
	submitButton := widget.NewButton("Calc netSegment", func() {
		// get data & calc
		// not check null | empty, no need for client self use
		fmt.Println("Calc netSegment ......")
		ips := strings.Split(ipv4, ".")
		subNetmaskIps := strings.Split(netmask, ".")
		var segNum = 0
		var result string
		for i := 0; i < len(ips); i++ {
			ipSeg, _ := strconv.ParseInt(ips[i], 10, 64)
			ipSeg2 := strconv.FormatInt(ipSeg, 2)
			ipSeg2 = fmt.Sprintf("%08s", ipSeg2)

			maskSeg, _ := strconv.ParseInt(subNetmaskIps[i], 10, 64)
			maskSeg2 := strconv.FormatInt(maskSeg, 2)
			maskSeg2 = fmt.Sprintf("%08s", maskSeg2)

			var builder strings.Builder
			for j := 0; j < 8; j++ {
				if maskSeg2[j] == '1' {
					segNum++
					builder.WriteByte(ipSeg2[j])
				} else {
					builder.WriteByte('0')
				}
			}
			ipSeg, _ = strconv.ParseInt(builder.String(), 2, 64)
			ipSeg10 := strconv.FormatInt(ipSeg, 10)
			result += ipSeg10 + "."
		}

		result = result[:len(result)-1] + "/" + strconv.Itoa(segNum)
		netSegmentEntry.SetText(result)
	})

	ipv4Item := widget.NewFormItem("IPv4 Address", ipv4Entry)
	subNetmaskItem := widget.NewFormItem("SubnetMask", subNetmaskEntry)
	formIn := widget.NewForm(ipv4Item, subNetmaskItem)
	netSegmentBoxItem := widget.NewFormItem("NetSegment", netSegmentEntry)
	netSegmentForm := widget.NewForm(netSegmentBoxItem)

	content := container.NewVBox(formIn, submitButton, netSegmentForm)
	demoWin.SetContent(content)
	demoWin.SetFixedSize(true)
	demoWin.Resize(fyne.NewSize(300, 160))
	demoWin.ShowAndRun()
}

使用了form,免得自己调各种样式,这里要注意window一定要先定义

另外计算网段没有使用位运算,如果是服务端,建议使用位运算,虽然难写和理解,但是效率高很多。

结果

测试多次均正确,因为是同环境,如果跨环境,涉及cgo交叉编译,比较麻烦,window的开发涉及系统的UI,fyne没有内置,使用的系统UI函数,所以,需要把相关的dll so dylib纳入项目。

mac桌面程序

写个Info.plist配置一个图标,然后写个脚本,通过脚本即可做成macOS应用app

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleIconFile</key>
	<string>NS</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleExecutable</key>
	<string>net-segment</string>
	<key>CFBundleGetInfoString</key>
	<string>calculate net-segment for ipv4</string>
	<key>CFBundleIdentifier</key>
	<string>net.demo.segment</string>
	<key>CFBundleName</key>
	<string>NetSegment</string>
	<key>LSUIElement</key>
	<string>1</string>
	<key>NSHighResolutionCapable</key>
	<true/>
	<key>NSHumanReadableCopyright</key>
	<string>Distributed under GNU General Public License v3.0</string>
	<key>CFBundleVersion</key>
	<string>1.0</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
</dict>
</plist>

写个简单脚本

#!/usr/bin

mkdir -p NS.app/Contents/MacOS/
cp net-segment NS.app/Contents/MacOS/
cp -r Info.plist NS.app/Contents
mkdir NS.app/Contents/Resources
cp NS.icns NS.app/Contents/Resources

图标自备,笔者的图标是从其他地方拔下来的,毕竟可能有版权问题

总结

其实就是没有现成的工具,笔者需要计算内网的网段,执行开墙,本来服务端写是最好的,大家都可以使用,但是笔者不想维护环境,不是很想为了这个功能专门部署,所以写了一个客户端,如果跨环境使用,cgo交叉编译麻烦,建议在对应的环境服务器编译。

C#实现轻量级P2P文件直传系统(绕过服务器) P2P文件传输指两终端不依赖中心服务器、直接建立网络连接进行数据交换的技术,其核心原理在于NAT穿透与端到端连接协商。在企业内网、跨局域网或移动热点等受限网络环境下,传统HTTP/FTP或云盘方案常因防火墙、权限管控或上传延迟而失效;而基于C#原生Socket构建的轻量级P2P模型,通过STUN/TURN辅助、自定义二进制协议与分层架构设计,实现了可控、可审计、低延迟的直连传输能力。该技术已广泛应用于固件协同、研发资料秒传、离线AI参数同步等场景,尤其适合Windows桌面环境下的安全合规部署。本文详解C# 阅读详情

相关推荐

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

Fyne实战:5分钟用Go语言打造你的第一个跨平台桌面应用(附完整代码)

本文是Fyne框架的实战入门指南,手把手教你用Go语言在5分钟内构建首个跨平台桌面应用。内容涵盖环境搭建、核心组件使用、交互式表单开发以及应用打包分发,帮助Go开发者快速将后端能力延伸至桌面端,实现轻量级工具的原型验证与分发。

vvv99的博客 815

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 378

使用Fyne框架开发本地IPv4网段计算工具

IP地址规划是网络管理的基础工作,涉及子网划分、地址分配等核心概念。通过将32位IPv4地址转换为二进制形式,可以精确计算网络地址、广播地址等关键参数。这类计算工具在运维自动化中具有重要价值,能显著提升网络规划效率。Fyne框架作为基于Go语言的跨平台GUI工具,以其轻量级特性和现代Material设计,非常适合开发此类桌面应用。该框架采用声明式UI设计模式,支持快速构建包含输入框、按钮等组件的交互界面。在实际工程中,结合net标准库的IP处理函数,可以高效实现CIDR解析、子网计算等核心算法。这类工具特别

weixin_31766003的博客 311

Setup&Hold互卡问题和Useful Skew的影响

setup和hold互卡问题分析

godping的博客 5092

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2513

Go+fyne实战:开发离线IPv4网段计算与子网掩码工具

IPv4网段计算是网络规划中的基础操作,涉及子网掩码、网络地址、广播地址和可用主机数等关键参数。手动换算容易在边界地址上出错,尤其在非整字节前缀如/25、/27、/30时。理解IP地址的二进制本质与位运算原理,是构建可靠计算工具的核心。桌面工具相比在线网页具有离线可用、数据不出内网、部署轻量等优势,适合隔离网络和现场排查场景。本文基于Go语言与fyne框架,从IPv4地址转换、掩码生成、特殊前缀处理到界面交互和跨平台打包,完整记录了一个离线网段计算器的设计与实现,为需要自研网络工具的工程师提供可复用的实践思

weixin_33806859的博客 247

手把手教学:用国产GLM-4.6替代Claude4.0,实现AI自动化编程全流程

本文提供了一份详细的教程,指导开发者使用国产GLM-4.6模型替代Claude 4.0,实现AI自动化编程。内容涵盖从获取API密钥、搭建本地环境、改造Claude Code工具到实战开发与VSCode集成的全流程,旨在帮助用户低成本、高效率地体验AI自主编程。

weixin_29070861的博客 551

M2 Mac mini跑Llama3

在4-19左右,Meta 宣布正式推出下一代开源大语言模型Llama 3;共包括 80 亿和 700 亿参数两种版本,号称 “是 Llama 2 的重大飞跃”,并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过,只不过自己电脑没什么显卡(核显),所以一直没跑llama,但是最近听说m2芯片可以运行,就体验了一下。看图表8B的数据可以在本地运行,70B就不用想了。试了一下真的可行。

fenglllle的博客 4147

基于STM32设计自动输液监测系统(241)

该系统集成了液位传感模块、光电传感器、电机模块、按键模块和OLED显示屏等多个功能模块,以实现全面的输液过程监控和控制。液位传感模块能够实时监测输液瓶中的液位,当液位到达限定值时,系统会自动控制步进电机夹紧输液管,并发出报警提醒,确保输液过程不会因液位过低而中断。

1341

杰理SDK入门教程(二):USB升级程序

开发板升级操作指南 摘要:本文介绍了开发板程序升级的两种方式(常规升级和串口升级),重点说明了常规升级的操作步骤: 拨码设置:提供4种拨码方式(不拨/1档/2档/3档),对应不同指示灯状态和按键要求 硬件连接:强制升级工具需正确连接电脑和开发板(注意USB接口方向) 升级流程:根据拨码状态操作按键,观察指示灯变化(红灯常亮绿灯灭表示进入升级模式) 执行升级:运行SDK中的download.bat完成升级 文中还包含拨码开关说明、指示灯状态对照表以及升级原理说明,帮助用户理解升级过程。升级成功后在设备管理器可

qq_42014563的博客 1114

LRU算法,以及Apache LRUMap源码解析

1. 什么是LRU LRU(least recently used) : 最近最少使用 LRU就是一种经典的算法,在容器中,对元素定义一个最后使用时间,当新的元素写入的时候,如果容器已满,则淘汰最近最少使用的元素,把新的元素写入。 1.1 自定义实现LRU的要求 比如redis,如何自己实现简易版的redis缓存。 那么我们需要一种数据结构,支持set和get操作。 1) get操作时...

fenglllle的博客 3081

强化学习算法案例——一个经典的走迷宫任务。

作者:禅与计算机程序设计艺术 1.简介 在强化学习(Reinforcement Learning, RL)中,有一个经典的任务——走迷宫,其原理简单易懂,但它的实际意义却深远,它让计算机学习如何通过策略网络(policy network),以最佳的方式解决复杂的任务。本文将介绍如何用强化学习解决这个经典

AI天才研究院 3213

hutool 解压缩读取源文件和压缩文件大小失败导致报错

最近处理老项目中的问题,升级安全jar,发现hutool的jar在解压缩的时候报错了,实际上是很简单的防御zip炸弹攻击的手段,但是却因为hutool的工具包取文件大小有bug,造成了解压缩不能用,报错:invalid sizes: compressed -1, uncompressed -1,理论上使用这个API的所有方法都有问题。影响范围hutool 5.8.11~5.8.16,5.8.17修复。 demo准备 构建一个demo吧:JDK8+hutool 5.8.16 没考虑流关闭问题,实际生

fenglllle的博客 2910

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

sonar-java 手写一个规则-单元测试分析

最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。sonar的自定义规则很简单,一般而言有2种模式可以使用:1. 自定义扫描代码逻辑,并对分类的Tree的结构处理2. 使用已扫描的分类,对分好类的Tree进行分析。

fenglllle的博客 2778

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

mapstruct和lombok同时使用的问题解析

mapstruct实际使用过程一言难尽啊,本身与idea有兼容性问题,不过新版本确实在一定程度上规避了问题,不过与lombok一起使用必须依赖lombok-mapstruct-binding才行,否则因为与lombok的顺序问题,运行过程并不会报错,结果很难保证。建议还是自己写getter和setter吧,性能没区别。

fenglllle的博客 2653

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot kafka多数据源,通过配置动态加载发送者和消费者

如果消费者或者发送者逻辑需要写在当前kafka网关应用,那么只能通过自定义扫描方式支持配置不同,所有配置的生成者和消费者必须代码实现逻辑,通过配置加载方式,自定义扫描注入bean即可。以消费者为例,生产者不涉及注解发送方式相对简单。});写了一个初始化的bean,用于通过配置加载bean。消费者是注解方式扫描,bean需要根据配置加载,不能写在代码里面这里仅仅是注册bean,并不会被beanpostprocessor处理关于第1点。

fenglllle的博客 1997

关于数字存储和byte[]数组的一些心得

实际上这次是一些碎碎念,核心还是计算机的原理,计算机因为电气性能只设计有0、1,所以是2进制,存算都是2进制。而且计算机在设计之初只设计了加法,没设计或者设计减法有问题,导致数据相减运算都是加运算,所以需要存储和运算负数,那么就需要定义负数的存储和相加逻辑,就设计了反码和补码来存储负数。另外一个字节存储能力有限,往往需要很多字节来存储一个内容,那么符号位的定义在总体结构很明晰,但是对于字节数组的单个字节就会存在歧义,造成数据可读性很迷惑,因为符号位的特殊意义。

fenglllle的博客 1656

项目中MySQL遇到的索引失效的问题

摘要:本文总结了MySQL使用中常见的索引失效问题及其解决方案。主要原因包括数据隐式转换(如数字与字符串类型不匹配)、统计信息更新不及时(在大批量数据变更后)等。这些问题在小数据量时不易察觉,但随着数据增长会导致全表扫描、查询超时等严重性能问题。建议:1) 尽量使用int而非varchar作为索引字段;2) 在大批量数据操作后执行ANALYZE TABLE更新统计信息;3) 建立监控机制及时发现全表扫描问题。这些措施能有效预防生产环境中的数据库性能问题。

fenglllle的博客 1087

flowable expression和json字符串中的双引号内容

通过示例可以看到字符串包括json需要对字符串的"内容进行转义,包括代码编写,class文件,但是jvm内存是不认"的转义符的,存储的就是真实的值,不存在转义的说法,而类似groovy脚本这样的类class语言实际上也是如此,毕竟操作在内存操作,class虚拟机不会有任何不同,毕竟class不一定能反编译Java,但是Java一定是编译为class,所以groovy并不会影响值操作的"结果。

fenglllle的博客 1085

雪花算法的一些问题解析

雪花算法实际上设计极为巧妙,通过时间戳,机器码,序列号(自增)来达到某个时间段(默认1毫秒)在某个并发下(并发超出自增ID就会重复或者阻塞等问题,不过我们一般达不到,且可以通过负载均衡增加资源规避),不重复ID。实现了加资源的方式来达到分布式ID不重复,且自增的特性。

fenglllle的博客 1070

3DES加解密的算法Java Python Golang

实际上仅仅是对称加密,实际上并不安全,不仅面临碰撞攻击,还面临着秘钥保存的问题,根据HTTPS的TLS密码设计,应该动态生成对称加密密钥,使用非对称加密算法交换密钥,根据会话动态变化。但是没有绝对的安全,实际上是加密和性能的取舍问题。非对称加密非常消耗计算性能,但是安全等级很高,对称加密对性能消耗较低,但是安全等级较低。以TLSv1.2为例,先通过非对称加密(证书)交换对称加密的秘钥,加密回话报文。

fenglllle的博客 1001

nginx自编译重现gzip和chunked的现象

其实gzip并不是最近才有的,以前我们经常压缩html,节省前端资源的传输带宽,只不过最近发现一些老旧项目对chunked支持不友好,导致nginx 1K以上就chunked导致请求报错。然后发现SpringBoot默认就chunked😁。nginx编译中实际上网上很多内容是复制的,笔者自己实践发现有些参数实际上不应该加上,理解也是跟我们认知有一定的理解偏差,实践发现without 状态要为disable,表示默认已经支持了,不需要加参数, with的模块需要编译加上参数,状态为enable。

fenglllle的博客 941

spring ai运行本地ollama大模型聊天

本文介绍了使用SpringAI 1.1.2版本与Ollama结合实现AI聊天功能的实践。通过配置ChatClient构建多轮对话系统,分析了HTTP交互过程和消息传递机制。实验表明,AI在逻辑分析方面表现良好,但存在模型知识更新滞后、结果不确定性等问题。文章还探讨了多轮对话实现方式、token消耗优化以及外部工具集成的必要性,指出当前AI仍需结合MCP服务、知识库等外部能力才能满足复杂需求,整体上呈现API编程的特征。

fenglllle的博客 776

MySQL explain format的差异

摘要:MySQL 9.5.0版本对EXPLAIN命令进行了优化,新增了TREE和JSON两种输出模式,默认采用TREE模式。TREE模式简洁直观,显示索引命中情况和执行成本评估;JSON模式提供更详细的信息但略显冗长。传统表格模式虽完整但不够直观。通过EXPLAIN ANALYZE可获取实际执行数据,包括预估成本、返回行数和执行时间等关键指标。新版EXPLAIN最大的改进是加入了成本评估功能,能清晰展示索引优化效果(如2万条数据下索引命中成本0.35vs全表扫描1960)。作者推荐使用TREE模式进行SQL

fenglllle的博客 677

Java基本数据类型存储与包装类源码解析

1. 首先,字节即byte,是二进制,最小的存储单位;位即bit,比特流,常用于网络传输:1byte=8bit。 2. 8种基本数据类型为:byte、short、int、long、float、double、char、boolean。 Java中没有类似C语言中的sizeof()函数,该函数的功能是计算变量的字节数。 但是Java中有包装类定义了8种基本数据类型的size(单位bit,...

fenglllle的博客 652
上一篇: MySQL explain format的差异
下一篇: macOS安装python并在PyCharm下启用自由线程
fenglllle
博客等级 码龄8年 461粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值