This commit is contained in:
esrrhs 2019-10-24 21:57:03 +08:00
parent 0c41f5e7d3
commit f512f32ec1
2 changed files with 64 additions and 7 deletions

View File

@ -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++

View File

@ -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 {