sendip.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "net/http"
  7. "net/url"
  8. "os/exec"
  9. qu "qfw/util"
  10. "time"
  11. )
  12. func mainT() {
  13. go timeTaskSendMsg_SendIp() //IP代理中心推送消息
  14. go func() {
  15. //time.Sleep(2 * time.Minute) //2分钟后开始切换IP
  16. for {
  17. runChangeIP_SendIp()
  18. time.Sleep(time.Duration(config.Interval) * time.Minute)
  19. }
  20. }()
  21. lock := make(chan bool)
  22. <-lock
  23. }
  24. func runChangeIP_SendIp() {
  25. if changing { //防止同时切换IP
  26. return
  27. }
  28. available = false //正在切换ip,设置ip已不可用
  29. changing = true //正在切换ip
  30. fmt.Println("准备切换IP...")
  31. //发布要换IP了
  32. changeIP_SendIp() //切换ip
  33. available = true
  34. changing = false //ip切换完成
  35. lifeTime = time.Now().Unix() + int64(config.Interval)*60 - 10 //ip有效时间(默认减少10秒)
  36. ischangedfirst = true //开启定时检测的标记
  37. fmt.Println("完成切换IP...")
  38. //ip切换成功,推送消息
  39. }
  40. func changeIP_SendIp() {
  41. for {
  42. fmt.Println("start change ip...")
  43. exec.Command("pppoe-stop").Run()
  44. exec.Command("pppoe-start").Run()
  45. fmt.Println("wait...")
  46. time.Sleep(10 * time.Second) //避免换IP后无法获取IP
  47. newIp := GetInterfaceIpv4Addr("ppp0") //获取新IP
  48. if newIp != "" && newIp != myoldip {
  49. fmt.Println("公网IP由", myoldip, "换为", newIp)
  50. myoldip = newIp
  51. break
  52. //ds, us := checkSpeed_SendIp(config.CheckSpeedAddr) //测速
  53. ////if ds >= config.DownSpeedLimit && us >= config.UploadSpeedLimit
  54. //if true { //网速达标
  55. // fmt.Println("IP测速通过", newIp)
  56. // myoldip = newIp
  57. // break
  58. //} else {
  59. // fmt.Println("IP测速不通过", newIp, ds, us)
  60. //}
  61. } else {
  62. fmt.Println("获取新IP失败...")
  63. }
  64. time.Sleep(5 * time.Second)
  65. }
  66. }
  67. // 测速
  68. func checkSpeed_SendIp(addr string) (float64, float64) {
  69. conn, err := net.Dial("tcp", addr)
  70. if err != nil {
  71. return 0, 0
  72. }
  73. defer conn.Close()
  74. t1 := time.Now()
  75. buf := make([]byte, 1024)
  76. for i := 0; i < 50; i++ {
  77. io.ReadFull(conn, buf)
  78. }
  79. dd := time.Since(t1)
  80. t1 = time.Now()
  81. for i := 0; i < 50; i++ {
  82. conn.Write(buf)
  83. }
  84. for {
  85. _, err := conn.Write(buf)
  86. if err != nil {
  87. break
  88. }
  89. time.Sleep(10 * time.Millisecond)
  90. }
  91. ud := time.Since(t1)
  92. dp, up := float64(0.05)/dd.Seconds(), float64(0.05)/ud.Seconds()
  93. msg := fmt.Sprintf(MSG_TPL, config.VpsName, float64(0.05)/dd.Seconds(), float64(0.05)/ud.Seconds())
  94. fmt.Println("网速测试,", msg)
  95. return dp, up
  96. }
  97. func timeTaskSendMsg_SendIp() {
  98. if config.SendIp {
  99. for {
  100. if !ischangedfirst { //服务启动,切换一次IP,再推送消息
  101. time.Sleep(10 * time.Second)
  102. continue
  103. }
  104. sPorts, fPorts := checkIpAndPort_SendIp() //检测IP和端口可用性
  105. //推送消息
  106. value := url.Values{
  107. "name": []string{config.VpsName}, //vps服务器名称(唯一)
  108. "ip": []string{qu.SE.EncodeString(myoldip)}, //加密ip
  109. "lifetime": []string{fmt.Sprint(lifeTime)}, //ip有效期
  110. "okport": sPorts, //可用端口
  111. "noport": fPorts, //不可用端口
  112. "available": []string{fmt.Sprint(available)}, //ip是否可用
  113. "changing": []string{fmt.Sprint(changing)}, //是否正在切换ip
  114. "iptype": []string{config.IpType}, //ip类型 0:普通vps; 1:阿里云; 2:linux_vps
  115. }
  116. for i := 1; i <= 3; i++ {
  117. client := &http.Client{
  118. Timeout: 3 * time.Second, // 设置超时时间为5秒
  119. }
  120. // 发送POST请求
  121. resp, err := client.PostForm(config.SendIpAddr, value)
  122. if err != nil {
  123. fmt.Println("POST请求失败:", err)
  124. continue
  125. }
  126. resp.Body.Close()
  127. break
  128. }
  129. fmt.Println("---send success---", time.Now().Unix())
  130. time.Sleep(time.Duration(config.SendInterval) * time.Second)
  131. }
  132. }
  133. }
  134. func checkIpAndPort_SendIp() (sPorts, fPorts []string) {
  135. //检测IP
  136. //if !changing { //正在切换IP,不做测速检测
  137. // fmt.Println("测速...")
  138. // ds, us := checkSpeed_SendIp(config.CheckSpeedAddr) //测速
  139. // if ds < config.DownSpeedLimit || us < config.UploadSpeedLimit { //网速不达标,切换IP
  140. // go runChangeIP_SendIp() //重新切换IP
  141. // }
  142. //}
  143. fmt.Println("检测端口...")
  144. //检测端口
  145. sPorts, fPorts = checkPort()
  146. if len(fPorts) == len(config.Ports) { //端口都不可用,重启端口
  147. go reStartPorts() //本轮检测重启,不可用
  148. }
  149. time.Sleep(1 * time.Second)
  150. return
  151. }