From d1ae3f5ba56bc2ad2c1f2c5a6d99f7682f2bb41e Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Tue, 17 Nov 2020 18:50:28 +0800 Subject: [PATCH] feature server quality test. --- client/client.go | 23 ++++++++++++++++++++++- client/global.go | 13 +++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index a864eb80..ddfedae8 100644 --- a/client/client.go +++ b/client/client.go @@ -12,6 +12,7 @@ import ( "math" "math/rand" "net" + "sort" "strconv" "strings" "sync" @@ -190,7 +191,6 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { IP: addr, Port: 8080, }) - break // 第一个就好23333 } cli.servers = append(hostAddrs, cli.servers...) } @@ -204,6 +204,27 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { {IP: net.IP{42, 81, 172, 22}, Port: 80}, } } + pings := make([]int64, len(cli.servers)) + wg := sync.WaitGroup{} + wg.Add(len(cli.servers)) + for i := range cli.servers { + go func(index int, w sync.WaitGroup) { + p, err := qualityTest(cli.servers[index]) + if err != nil { + pings[index] = 9999 + return + } + pings[index] = p + wg.Done() + }(i, wg) + } + wg.Wait() + sort.Slice(cli.servers, func(i, j int) bool { + return pings[i] < pings[j] + }) + if len(cli.servers) > 3 { + cli.servers = cli.servers[0 : len(cli.servers)/2] // 保留ping值中位数以上的server + } rand.Read(cli.RandomKey) return cli } diff --git a/client/global.go b/client/global.go index 9e60e055..0f69a402 100644 --- a/client/global.go +++ b/client/global.go @@ -17,6 +17,7 @@ import ( "net" "sort" "strings" + "time" ) type DeviceInfo struct { @@ -338,6 +339,18 @@ func getSSOAddress() ([]*net.TCPAddr, error) { return adds, nil } +func qualityTest(addr *net.TCPAddr) (int64, error) { + // see QualityTestManager + start := time.Now() + conn, err := net.DialTCP("tcp", nil, addr) + if err != nil { + return 0, err + } + _ = conn.Close() + end := time.Now() + return end.Sub(start).Milliseconds(), nil +} + func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage { friend := c.FindFriend(msg.Head.FromUin) var sender *message.Sender