使用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

正常写代码

Go 复制代码
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纳入项目。

总结

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

相关推荐
码匠许师傅17 小时前
【C++ 面试真题】聊聊 volatile 和 mutable
开发语言·c++·面试
(Charon)17 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
liwulin050617 小时前
【PYTHON】使用Selenium + ChromeDriver以及XPATH语法
开发语言·python·selenium
JavaPub-rodert17 小时前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
动力 continue17 小时前
Python 元类与异常类:类的“制造工厂”与“报错定制师”
开发语言·python·制造
quantdash_cc18 小时前
基于 QuantDash 5 分钟 K 线的网格交易策略参数网格搜索寻优实战
android·开发语言·pandas·量化·quantdash
147API18 小时前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆18 小时前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11
kels889918 小时前
实战排坑:黄金实时API开发,XAUUSD Tick报文异常处理实践
开发语言·python·websocket·网络协议·信息可视化
阿pin18 小时前
Java随笔-JDK7 HashMap头插法为何能导致死循环?
java·开发语言·hashmap