diff --git a/transport/internet/kcp/kcp.go b/transport/internet/kcp/kcp.go index 58d4cbe08..9368bb349 100644 --- a/transport/internet/kcp/kcp.go +++ b/transport/internet/kcp/kcp.go @@ -279,6 +279,7 @@ func (kcp *KCP) Input(data []byte) int { kcp.update_ack(_itimediff(kcp.current, ts)) } kcp.parse_ack(sn) + kcp.shrink_buf() if flag == 0 { flag = 1 maxack = sn @@ -300,9 +301,9 @@ func (kcp *KCP) Input(data []byte) int { } kcp.HandleReceivingNext(seg.ReceivinNext) kcp.HandleSendingNext(seg.SendingNext) + kcp.shrink_buf() default: } - kcp.shrink_buf() } if flag != 0 { diff --git a/transport/internet/kcp/sending.go b/transport/internet/kcp/sending.go index d2c891377..6a8ca78b4 100644 --- a/transport/internet/kcp/sending.go +++ b/transport/internet/kcp/sending.go @@ -53,6 +53,10 @@ func (this *SendingWindow) Clear(una uint32) { } func (this *SendingWindow) Remove(idx uint32) { + if this.len == 0 { + return + } + pos := (this.start + idx) % this.cap seg := this.data[pos] if seg == nil { @@ -80,6 +84,9 @@ func (this *SendingWindow) Remove(idx uint32) { } func (this *SendingWindow) HandleFastAck(number uint32) { + if this.len == 0 { + return + } for i := this.start; ; i = this.next[i] { seg := this.data[i]