refactor:使用指定DNS彻底解决DNS缓存导致的问题
This commit is contained in:
@@ -26,4 +26,4 @@ Config.json说明:
|
|||||||
"demo_mode": false //测试模式,报错更详细,且生成运行日志与错误日志
|
"demo_mode": false //测试模式,报错更详细,且生成运行日志与错误日志
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
package Request
|
package Request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"Mmx/Util"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Get(Url string, Query map[string]string) (string, error) {
|
func Get(Url string, Query map[string]string) (string, error) {
|
||||||
@@ -20,7 +23,17 @@ func Get(Url string, Query map[string]string) (string, error) {
|
|||||||
}
|
}
|
||||||
req.URL.RawQuery = q.Encode()
|
req.URL.RawQuery = q.Encode()
|
||||||
}
|
}
|
||||||
resp, err := (&http.Client{}).Do(req)
|
resp, err := (&http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
DialContext: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
Resolver: &net.Resolver{
|
||||||
|
PreferGo: true,
|
||||||
|
Dial: Util.NetDailEr(),
|
||||||
|
},
|
||||||
|
}).DialContext,
|
||||||
|
},
|
||||||
|
}).Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
@@ -1,36 +1,23 @@
|
|||||||
package Util
|
package Util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"Mmx/Request"
|
"context"
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type checker struct{}
|
type checker struct{}
|
||||||
|
|
||||||
var Checker checker
|
var Checker checker
|
||||||
|
|
||||||
func (checker) NetOk(url string) bool {
|
func (checker) NetOk() bool {
|
||||||
if ip, err := net.LookupIP("www.msftconnecttest.com"); err != nil { //通过DNS确认是否在线
|
r := &net.Resolver{ //指定DNS,防止本地DNS缓存影响
|
||||||
|
PreferGo: true,
|
||||||
|
Dial: NetDailEr(),
|
||||||
|
}
|
||||||
|
if ip, err := r.LookupIP(context.Background(), "ip4", "www.msftconnecttest.com"); err != nil { //通过DNS确认是否在线
|
||||||
return false
|
return false
|
||||||
} else if len(ip) == 0 || ip[0].String() != "13.107.4.52" {
|
} else if len(ip) == 0 || ip[0].String() != "13.107.4.52" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
{ //有些路由器有DNS缓存,故进行进一步确认
|
|
||||||
body, err := Request.Get(url, map[string]string{
|
|
||||||
"callback": "jQuery1635413",
|
|
||||||
"_": fmt.Sprint(time.Now().UnixNano()),
|
|
||||||
})
|
|
||||||
ErrHandler(err)
|
|
||||||
r, err := GetResult(body)
|
|
||||||
if err != nil {
|
|
||||||
ErrHandler(err)
|
|
||||||
}
|
|
||||||
if r != "ok" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
12
Util/util.go
12
Util/util.go
@@ -2,13 +2,16 @@ package Util
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Mmx/Global"
|
"Mmx/Global"
|
||||||
|
"context"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Search(reg string, content string) (string, error) {
|
func Search(reg string, content string) (string, error) {
|
||||||
@@ -57,3 +60,12 @@ func ErrHandler(err error) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NetDailEr() func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
return func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||||
|
d := net.Dialer{
|
||||||
|
Timeout: 20 * time.Second,
|
||||||
|
}
|
||||||
|
return d.DialContext(ctx, "udp", "1.2.4.8:53")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -13,7 +13,7 @@ func main() {
|
|||||||
Util.Log.Println("Step0: 检查状态…")
|
Util.Log.Println("Step0: 检查状态…")
|
||||||
G := Global.Config.Generate()
|
G := Global.Config.Generate()
|
||||||
|
|
||||||
if Global.Config.Settings.QuitIfNetOk && Util.Checker.NetOk(G.UrlCheckApi) {
|
if Global.Config.Settings.QuitIfNetOk && Util.Checker.NetOk() {
|
||||||
Util.Log.Println("网络正常,程序退出")
|
Util.Log.Println("网络正常,程序退出")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user