From f512f32ec13c3515699fd6d0b1fb86e4a933c540 Mon Sep 17 00:00:00 2001 From: esrrhs Date: Thu, 24 Oct 2019 21:57:03 +0800 Subject: [PATCH] add --- client.go | 38 +++++++++++++++++++++++++++++++++----- framemgr.go | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/client.go b/client.go index df94a3a..e343282 100644 --- a/client.go +++ b/client.go @@ -256,6 +256,23 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn) { SEND_PROTO, RECV_PROTO, p.key, p.tcpmode, p.tcpmode_buffersize, p.tcpmode_maxwin, p.tcpmode_resend_timems) } + + if clientConn.fm.GetRecvBufferSize() > 0 { + rr := clientConn.fm.GetRecvReadLineBuffer() + + conn.SetWriteDeadline(time.Now().Add(time.Millisecond * 100)) + n, err := conn.Write(rr) + if err != nil { + nerr, ok := err.(net.Error) + if !ok || !nerr.Timeout() { + loggo.Error("Error write tcp %s %s %s", uuid, tcpsrcaddr.String(), err) + break + } + } + if n > 0 { + clientConn.fm.SkipRecvBuffer(n) + } + } } loggo.Info("close inactive conn %s %s", clientConn.id, clientConn.tcpaddr.String()) @@ -340,11 +357,22 @@ func (p *Client) processPacket(packet *Packet) { now := time.Now() clientConn.activeTime = now - _, err := p.listenConn.WriteToUDP(packet.my.Data, addr) - if err != nil { - loggo.Error("WriteToUDP Error read udp %s", err) - clientConn.close = true - return + if p.tcpmode > 0 { + f := &Frame{} + err := proto.Unmarshal(packet.my.Data, f) + if err != nil { + loggo.Error("Unmarshal tcp Error %s", err) + return + } + + clientConn.fm.OnRecvFrame(f) + } else { + _, err := p.listenConn.WriteToUDP(packet.my.Data, addr) + if err != nil { + loggo.Error("WriteToUDP Error read udp %s", err) + clientConn.close = true + return + } } p.recvPacket++ diff --git a/framemgr.go b/framemgr.go index d101b7b..3930a2a 100644 --- a/framemgr.go +++ b/framemgr.go @@ -51,12 +51,13 @@ func (fm *FrameMgr) Update() { fm.cutSendBufferToWindow() fm.sendlist.Init() + tmpreq, tmpack, tmpackto := fm.preProcessRecvList() fm.processRecvList(tmpreq, tmpack, tmpackto) - fm.calSendList() - fm.combineWindowToRecvBuffer() + + fm.calSendList() } func (fm *FrameMgr) cutSendBufferToWindow() { @@ -251,6 +252,34 @@ func (fm *FrameMgr) combineWindowToRecvBuffer() { } } } + + reqtmp := make(map[int]int) + e := fm.recvwin.Front() + id = fm.recvid + for len(reqtmp) < fm.windowsize && e != nil { + f := e.Value.(*Frame) + if f.Id != (int32)(id) { + reqtmp[id]++ + } else { + reqtmp[id]++ + e = e.Next() + } + + id++ + if fm.recvid >= FRAME_MAX_ID { + fm.recvid = 0 + } + } + + f := &Frame{Type: (int32)(Frame_REQ), Resend: false, Sendtime: 0, + Id: 0, + Dataid: make([]int32, len(reqtmp))} + index := 0 + for id, _ := range reqtmp { + f.Dataid[index] = (int32)(id) + index++ + } + fm.sendlist.PushBack(f) } func (fm *FrameMgr) GetRecvBufferSize() int {