mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
fix connection issues.
This commit is contained in:
parent
c1be499251
commit
8408c5ac5f
@ -29,9 +29,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type QQClient struct {
|
type QQClient struct {
|
||||||
Uin int64
|
Uin int64
|
||||||
PasswordMd5 [16]byte
|
PasswordMd5 [16]byte
|
||||||
CustomServer *net.TCPAddr
|
|
||||||
|
|
||||||
Nickname string
|
Nickname string
|
||||||
Age uint16
|
Age uint16
|
||||||
@ -48,8 +47,9 @@ type QQClient struct {
|
|||||||
|
|
||||||
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
|
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
|
||||||
handlers sync.Map
|
handlers sync.Map
|
||||||
server *net.TCPAddr
|
servers []*net.TCPAddr
|
||||||
currServerIndex int32
|
currServerIndex int
|
||||||
|
retryTimes int
|
||||||
|
|
||||||
syncCookie []byte
|
syncCookie []byte
|
||||||
pubAccountCookie []byte
|
pubAccountCookie []byte
|
||||||
@ -150,6 +150,23 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
|
|||||||
eventHandlers: &eventHandlers{},
|
eventHandlers: &eventHandlers{},
|
||||||
msgSvcCache: utils.NewCache(time.Second * 15),
|
msgSvcCache: utils.NewCache(time.Second * 15),
|
||||||
transCache: utils.NewCache(time.Second * 15),
|
transCache: utils.NewCache(time.Second * 15),
|
||||||
|
servers: []*net.TCPAddr{ // default servers
|
||||||
|
{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},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
adds, err := net.LookupIP("msfwifi.3g.qq.com") // host servers
|
||||||
|
if err == nil && len(adds) > 0 {
|
||||||
|
addr := &net.TCPAddr{
|
||||||
|
IP: adds[0],
|
||||||
|
Port: 8080,
|
||||||
|
}
|
||||||
|
cli.servers = append([]*net.TCPAddr{addr}, cli.servers...)
|
||||||
}
|
}
|
||||||
rand.Read(cli.RandomKey)
|
rand.Read(cli.RandomKey)
|
||||||
return cli
|
return cli
|
||||||
@ -160,7 +177,6 @@ func (c *QQClient) Login() (*LoginResponse, error) {
|
|||||||
if c.Online {
|
if c.Online {
|
||||||
return nil, ErrAlreadyOnline
|
return nil, ErrAlreadyOnline
|
||||||
}
|
}
|
||||||
c.server = nil
|
|
||||||
err := c.connect()
|
err := c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -856,47 +872,34 @@ 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 {
|
func (c *QQClient) connect() error {
|
||||||
if c.server == nil {
|
c.Info("connect to server: %v", c.servers[c.currServerIndex].String())
|
||||||
if c.CustomServer != nil {
|
conn, err := net.DialTCP("tcp", nil, c.servers[c.currServerIndex])
|
||||||
c.server = c.CustomServer
|
c.currServerIndex++
|
||||||
} else {
|
if c.currServerIndex == len(c.servers) {
|
||||||
addrs, err := net.LookupIP("msfwifi.3g.qq.com")
|
c.currServerIndex = 0
|
||||||
if err == nil && len(addrs) > 0 {
|
|
||||||
c.server = &net.TCPAddr{
|
|
||||||
IP: addrs[rand.Intn(len(addrs))],
|
|
||||||
Port: 8080,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
c.server = servers[rand.Intn(len(servers))]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c.Info("connect to server: %v", c.server.String())
|
|
||||||
conn, err := net.DialTCP("tcp", nil, c.server)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.CustomServer != nil {
|
c.retryTimes++
|
||||||
c.CustomServer = nil
|
if c.retryTimes > len(c.servers) {
|
||||||
return c.connect()
|
return errors.New("network error")
|
||||||
|
}
|
||||||
|
c.Error("connect server error: %v", err)
|
||||||
|
if err = c.connect(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
c.retryTimes = 0
|
||||||
c.ConnectTime = time.Now()
|
c.ConnectTime = time.Now()
|
||||||
c.Conn = conn
|
c.Conn = conn
|
||||||
c.onlinePushCache = []int16{}
|
c.onlinePushCache = []int16{}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) SetCustomServer(servers []*net.TCPAddr) {
|
||||||
|
c.servers = append(servers, c.servers...)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) registerClient() {
|
func (c *QQClient) registerClient() {
|
||||||
_, packet := c.buildClientRegisterPacket()
|
_, packet := c.buildClientRegisterPacket()
|
||||||
_ = c.send(packet)
|
_ = c.send(packet)
|
||||||
@ -976,11 +979,6 @@ func (c *QQClient) netLoop() {
|
|||||||
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)
|
c.Error("connection dropped by server: %v", err)
|
||||||
if c.ConnectTime.Sub(time.Now()) < time.Minute && c.CustomServer != nil {
|
|
||||||
c.Error("custom server error.")
|
|
||||||
c.CustomServer = nil
|
|
||||||
c.server = nil
|
|
||||||
}
|
|
||||||
err = c.connect()
|
err = c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
|
@ -137,11 +137,15 @@ func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, er
|
|||||||
servers := []jce.SsoServerInfo{}
|
servers := []jce.SsoServerInfo{}
|
||||||
ssoPkt.ReadSlice(&servers, 1)
|
ssoPkt.ReadSlice(&servers, 1)
|
||||||
if len(servers) > 0 {
|
if len(servers) > 0 {
|
||||||
c.server = &net.TCPAddr{
|
var adds []*net.TCPAddr
|
||||||
IP: net.ParseIP(servers[0].Server),
|
for _, s := range servers {
|
||||||
Port: int(servers[0].Port),
|
c.Debug("got new server addr: %v location: %v", s.Server, s.Location)
|
||||||
|
adds = append(adds, &net.TCPAddr{
|
||||||
|
IP: net.ParseIP(s.Server),
|
||||||
|
Port: int(s.Port),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
c.Debug("got new server addr: %v location: %v", c.server.String(), servers[0].Location)
|
c.SetCustomServer(adds)
|
||||||
for _, e := range c.eventHandlers.serverUpdatedHandlers {
|
for _, e := range c.eventHandlers.serverUpdatedHandlers {
|
||||||
cover(func() {
|
cover(func() {
|
||||||
e(c, &ServerUpdatedEvent{Servers: servers})
|
e(c, &ServerUpdatedEvent{Servers: servers})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user