网络相关
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
1.6 KiB

3 years ago
  1. package network
  2. import (
  3. "crypto/rand"
  4. "math/big"
  5. "net"
  6. "strconv"
  7. )
  8. /**
  9. 扫描本机空闲端口
  10. 参数说明
  11. startPort 扫描开始端口 不包含这个端口
  12. endPort 扫描结束端口 不包含这个端口
  13. count 扫描端口数量
  14. */
  15. func ScanPort(startPort, endPort int64, count int) []int64 {
  16. usePort := make([]int64, 0)
  17. for startPort < endPort {
  18. startPort = startPort + 1
  19. udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(startPort), 10))
  20. if err != nil {
  21. continue
  22. }
  23. udpConn, err := net.ListenUDP("udp", udpserver)
  24. if err != nil {
  25. continue
  26. }
  27. udpConn.Close()
  28. ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(startPort), 10))
  29. if err != nil {
  30. continue
  31. }
  32. usePort = append(usePort, startPort)
  33. ln.Close()
  34. if len(usePort) >= count {
  35. break
  36. }
  37. }
  38. return usePort
  39. }
  40. /**
  41. * 取随机端口
  42. */
  43. func RandPort(min, max int64) int64 {
  44. var port int64
  45. for {
  46. port = RandInt64(min, max)
  47. udpserver, err := net.ResolveUDPAddr("udp", ":"+strconv.FormatInt(int64(port), 10))
  48. if err != nil {
  49. continue
  50. }
  51. udpConn, err := net.ListenUDP("udp", udpserver)
  52. if err != nil {
  53. continue
  54. }
  55. udpConn.Close()
  56. ln, err := net.Listen("tcp", "0.0.0.0:"+strconv.FormatInt(int64(port), 10))
  57. if err != nil {
  58. continue
  59. }
  60. ln.Close()
  61. break
  62. }
  63. return port
  64. }
  65. /**
  66. * 取随机数
  67. */
  68. func RandInt64(min, max int64) int64 {
  69. var randnum int64
  70. for {
  71. maxBigInt := big.NewInt(max)
  72. i, _ := rand.Int(rand.Reader, maxBigInt)
  73. if i.Int64() > min {
  74. randnum = i.Int64()
  75. break
  76. }
  77. }
  78. return randnum
  79. }