utils.go 989 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. "path"
  7. "strconv"
  8. "strings"
  9. )
  10. func GetFreePort() (int, error) {
  11. addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
  12. if err != nil {
  13. return 0, err
  14. }
  15. l, err := net.ListenTCP("tcp", addr)
  16. if err != nil {
  17. return 0, err
  18. }
  19. defer l.Close()
  20. return l.Addr().(*net.TCPAddr).Port, nil
  21. }
  22. func createPorts() (ws int, nport int, err error) {
  23. ws, err = GetFreePort()
  24. if err != nil {
  25. return
  26. }
  27. nport, err = GetFreePort()
  28. if err != nil {
  29. return
  30. }
  31. return
  32. }
  33. func GenHttpPort() (int, int, error) {
  34. portFile := path.Join(AppDataDir, "ports")
  35. portStr, err := os.ReadFile(portFile)
  36. if err == nil && len(portStr) > 0 {
  37. ports := strings.Split(string(portStr), "#")
  38. wsport, _ := strconv.Atoi(ports[0])
  39. nsport, _ := strconv.Atoi(ports[1])
  40. return wsport, nsport, nil
  41. }
  42. p1, p2, e := createPorts()
  43. if e != nil {
  44. return 0, 0, e
  45. }
  46. os.WriteFile(portFile, []byte(fmt.Sprintf("%d#%d", p1, p2)), os.ModePerm)
  47. return p1, p2, nil
  48. }