1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

fix issue of connection lost.

This commit is contained in:
Mrs4s 2020-09-11 17:56:24 +08:00
parent 808a63a78e
commit a56bdf2a3e
5 changed files with 43 additions and 0 deletions

View File

@ -27,6 +27,12 @@ type (
Map map[string]map[string][]byte `jceId:"0"` Map map[string]map[string][]byte `jceId:"0"`
} }
SsoServerInfo struct {
Server string `jceId:"1"`
Port int32 `jceId:"2"`
Location string `jceId:"8"`
}
SvcReqRegister struct { SvcReqRegister struct {
IJceStruct IJceStruct
Uin int64 `jceId:"0"` Uin int64 `jceId:"0"`
@ -358,6 +364,12 @@ func (pkt *RequestDataVersion2) ReadFrom(r *JceReader) {
}) })
} }
func (pkt *SsoServerInfo) ReadFrom(r *JceReader) {
pkt.Server = r.ReadString(1)
pkt.Port = r.ReadInt32(2)
pkt.Location = r.ReadString(8)
}
func (pkt *SvcReqRegister) ToBytes() []byte { func (pkt *SvcReqRegister) ToBytes() []byte {
w := NewJceWriter() w := NewJceWriter()
w.WriteJceStructRaw(pkt) w.WriteJceStructRaw(pkt)

View File

@ -936,6 +936,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
case <-time.After(time.Second * 30): case <-time.After(time.Second * 30):
retry++ retry++
if retry < 2 { if retry < 2 {
c.Error("packet %v timed out. retry.", seq)
_ = c.send(pkt) _ = c.send(pkt)
continue continue
} }
@ -954,6 +955,7 @@ func (c *QQClient) netLoop() {
for c.Online { for c.Online {
l, err := reader.ReadInt32() l, err := reader.ReadInt32()
if err == io.EOF || err == io.ErrClosedPipe { if err == io.EOF || err == io.ErrClosedPipe {
c.Error("connection dropped by server: %v", err)
err = c.connect() err = c.connect()
if err != nil { if err != nil {
break break

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/Mrs4s/MiraiGo/client/pb/pttcenter" "github.com/Mrs4s/MiraiGo/client/pb/pttcenter"
"log" "log"
"net"
"strconv" "strconv"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -130,6 +131,24 @@ func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, er
jceBuf := []byte{} jceBuf := []byte{}
t := r.ReadInt32(1) t := r.ReadInt32(1)
r.ReadSlice(&jceBuf, 2) r.ReadSlice(&jceBuf, 2)
if t == 1 && len(jceBuf) > 0 {
ssoPkt := jce.NewJceReader(jceBuf)
servers := []jce.SsoServerInfo{}
ssoPkt.ReadSlice(&servers, 1)
if len(servers) > 0 {
c.server = &net.TCPAddr{
IP: net.ParseIP(servers[0].Server),
Port: int(servers[0].Port),
}
c.Debug("got new server addr: %v location: %v", c.server.String(), servers[0].Location)
for _, e := range c.eventHandlers.serverUpdatedHandlers {
cover(func() {
e(c, &ServerUpdatedEvent{Servers: servers})
})
}
return nil, nil
}
}
seq := r.ReadInt64(3) seq := r.ReadInt64(3)
_, pkt := c.buildConfPushRespPacket(t, seq, jceBuf) _, pkt := c.buildConfPushRespPacket(t, seq, jceBuf)
return nil, c.send(pkt) return nil, c.send(pkt)

View File

@ -2,6 +2,7 @@ package client
import ( import (
"errors" "errors"
"github.com/Mrs4s/MiraiGo/binary/jce"
"strings" "strings"
"sync" "sync"
) )
@ -154,6 +155,10 @@ type (
Message string Message string
} }
ServerUpdatedEvent struct {
Servers []jce.SsoServerInfo
}
NewFriendEvent struct { NewFriendEvent struct {
Friend *FriendInfo Friend *FriendInfo
} }

View File

@ -24,6 +24,7 @@ type eventHandlers struct {
newFriendHandlers []func(*QQClient, *NewFriendEvent) newFriendHandlers []func(*QQClient, *NewFriendEvent)
disconnectHandlers []func(*QQClient, *ClientDisconnectedEvent) disconnectHandlers []func(*QQClient, *ClientDisconnectedEvent)
logHandlers []func(*QQClient, *LogEvent) logHandlers []func(*QQClient, *LogEvent)
serverUpdatedHandlers []func(*QQClient, *ServerUpdatedEvent)
groupMessageReceiptHandlers sync.Map groupMessageReceiptHandlers sync.Map
} }
@ -99,6 +100,10 @@ func (c *QQClient) OnDisconnected(f func(*QQClient, *ClientDisconnectedEvent)) {
c.eventHandlers.disconnectHandlers = append(c.eventHandlers.disconnectHandlers, f) c.eventHandlers.disconnectHandlers = append(c.eventHandlers.disconnectHandlers, f)
} }
func (c *QQClient) OnServerUpdated(f func(*QQClient, *ServerUpdatedEvent)) {
c.eventHandlers.serverUpdatedHandlers = append(c.eventHandlers.serverUpdatedHandlers, f)
}
func (c *QQClient) OnLog(f func(*QQClient, *LogEvent)) { func (c *QQClient) OnLog(f func(*QQClient, *LogEvent)) {
c.eventHandlers.logHandlers = append(c.eventHandlers.logHandlers, f) c.eventHandlers.logHandlers = append(c.eventHandlers.logHandlers, f)
} }