diff --git a/client/client.go b/client/client.go index 3fce6687..d1199899 100644 --- a/client/client.go +++ b/client/client.go @@ -155,7 +155,7 @@ func (c *QQClient) Login() (*LoginResponse, error) { if l.Success { c.lastLostMsg = "" c.registerClient() - go c.heartbeat() + c.startHeartbeat() _, _ = c.sendAndWait(c.buildGetMessageRequestPacket(msg.SyncFlag_START, time.Now().Unix())) } return &l, nil @@ -171,7 +171,7 @@ func (c *QQClient) SubmitCaptcha(result string, sign []byte) (*LoginResponse, er l := rsp.(LoginResponse) if l.Success { c.registerClient() - go c.heartbeat() + c.startHeartbeat() } return &l, nil } @@ -606,8 +606,18 @@ func (g *GroupInfo) removeMember(uin int64) { } } +var servers = []*net.TCPAddr{ + {IP: net.IP{42, 81, 169, 46}, Port: 8080}, + {IP: net.IP{42, 81, 172, 81}, Port: 80}, + {IP: net.IP{114, 221, 148, 59}, Port: 14000}, + {IP: net.IP{42, 81, 172, 147}, Port: 443}, + {IP: net.IP{125, 94, 60, 146}, Port: 80}, + {IP: net.IP{114, 221, 144, 215}, Port: 80}, + {IP: net.IP{42, 81, 172, 22}, Port: 80}, +} + func (c *QQClient) connect() error { - conn, err := net.Dial("tcp", "125.94.60.146:80") //TODO: more servers + conn, err := net.DialTCP("tcp", nil, servers[rand.Intn(len(servers))]) if err != nil { return err } @@ -687,6 +697,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) { return rsp.Response, rsp.Error case <-time.After(time.Second * 15): c.handlers.Delete(seq) + println("Packet Timed out") return nil, errors.New("time out") } } @@ -758,12 +769,16 @@ func (c *QQClient) loop() { c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: c.lastLostMsg}) } -func (c *QQClient) heartbeat() { - for c.Online { - time.Sleep(time.Second * 30) +func (c *QQClient) startHeartbeat() { + time.AfterFunc(30*time.Second, c.doHeartbeat) +} + +func (c *QQClient) doHeartbeat() { + if c.Online { seq := c.nextSeq() sso := packets.BuildSsoPacket(seq, "Heartbeat.Alive", SystemDeviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, []byte{}, c.ksid) packet := packets.BuildLoginPacket(c.Uin, 0, []byte{}, sso, []byte{}) _, _ = c.sendAndWait(seq, packet) + time.AfterFunc(30*time.Second, c.doHeartbeat) } }