port.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package port
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. // 获取可用端口
  7. func GetAvailablePort(t string) (int, error) {
  8. address := fmt.Sprintf("%s:0", "0.0.0.0")
  9. if t == "udp" {
  10. add, err := net.ResolveUDPAddr(t, address)
  11. if err != nil {
  12. return 0, err
  13. }
  14. listener, err := net.ListenUDP(t, add)
  15. if err != nil {
  16. return 0, err
  17. }
  18. defer listener.Close()
  19. return listener.LocalAddr().(*net.UDPAddr).Port, nil
  20. } else {
  21. add, err := net.ResolveTCPAddr(t, address)
  22. if err != nil {
  23. return 0, err
  24. }
  25. listener, err := net.ListenTCP(t, add)
  26. if err != nil {
  27. return 0, err
  28. }
  29. defer listener.Close()
  30. return listener.Addr().(*net.TCPAddr).Port, nil
  31. }
  32. }
  33. // 判断端口是否可以(未被占用)
  34. // param t tcp/udp
  35. func IsPortAvailable(port int, t string) bool {
  36. address := fmt.Sprintf("%s:%d", "0.0.0.0", port)
  37. if t == "udp" {
  38. sadd, err := net.ResolveUDPAddr("udp", address)
  39. uc, err := net.ListenUDP("udp", sadd)
  40. if err != nil {
  41. fmt.Println(err.Error())
  42. return false
  43. } else {
  44. defer uc.Close()
  45. return true
  46. }
  47. } else {
  48. listener, err := net.Listen(t, address)
  49. if err != nil {
  50. //log.Infof("port %s is taken: %s", address, err)
  51. return false
  52. }
  53. defer listener.Close()
  54. return true
  55. }
  56. }