package main import ( "fmt" "net" "os" "path" "strconv" "strings" ) func GetFreePort() (int, error) { addr, err := net.ResolveTCPAddr("tcp", "localhost:0") if err != nil { return 0, err } l, err := net.ListenTCP("tcp", addr) if err != nil { return 0, err } defer l.Close() return l.Addr().(*net.TCPAddr).Port, nil } func createPorts() (ws int, nport int, err error) { ws, err = GetFreePort() if err != nil { return } nport, err = GetFreePort() if err != nil { return } return } func GenHttpPort() (int, int, error) { portFile := path.Join(AppDataDir, "ports") portStr, err := os.ReadFile(portFile) if err == nil && len(portStr) > 0 { ports := strings.Split(string(portStr), "#") wsport, _ := strconv.Atoi(ports[0]) nsport, _ := strconv.Atoi(ports[1]) return wsport, nsport, nil } p1, p2, e := createPorts() if e != nil { return 0, 0, e } os.WriteFile(portFile, []byte(fmt.Sprintf("%d#%d", p1, p2)), os.ModePerm) return p1, p2, nil }