Fix receiving update

pull/215/head
v2ray 9 years ago
parent 313b3c1db0
commit 71c9bd678c
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169

@ -183,6 +183,7 @@ func (kcp *KCP) DumpReceivingBuf() {
kcp.rcv_queue = append(kcp.rcv_queue, seg) kcp.rcv_queue = append(kcp.rcv_queue, seg)
kcp.rcv_buf.Advance() kcp.rcv_buf.Advance()
kcp.rcv_nxt++ kcp.rcv_nxt++
kcp.receivingUpdated = true
} }
} }
@ -288,8 +289,9 @@ func (kcp *KCP) HandleReceivingNext(receivingNext uint32) {
} }
func (kcp *KCP) HandleSendingNext(sendingNext uint32) { func (kcp *KCP) HandleSendingNext(sendingNext uint32) {
kcp.acklist.Clear(sendingNext) if kcp.acklist.Clear(sendingNext) {
kcp.receivingUpdated = true kcp.receivingUpdated = true
}
} }
func (kcp *KCP) parse_data(newseg *DataSegment) { func (kcp *KCP) parse_data(newseg *DataSegment) {
@ -325,6 +327,7 @@ func (kcp *KCP) Input(data []byte) int {
kcp.HandleOption(seg.Opt) kcp.HandleOption(seg.Opt)
kcp.HandleSendingNext(seg.SendingNext) kcp.HandleSendingNext(seg.SendingNext)
kcp.acklist.Add(seg.Number, seg.Timestamp) kcp.acklist.Add(seg.Number, seg.Timestamp)
kcp.receivingUpdated = true
kcp.parse_data(seg) kcp.parse_data(seg)
kcp.lastPayloadTime = kcp.current kcp.lastPayloadTime = kcp.current
case *ACKSegment: case *ACKSegment:
@ -407,6 +410,7 @@ func (kcp *KCP) flush() {
lost := false lost := false
// flush acknowledges // flush acknowledges
//if kcp.receivingUpdated {
ackSeg := kcp.acklist.AsSegment() ackSeg := kcp.acklist.AsSegment()
if ackSeg != nil { if ackSeg != nil {
ackSeg.Conv = kcp.conv ackSeg.Conv = kcp.conv
@ -415,6 +419,7 @@ func (kcp *KCP) flush() {
kcp.output.Write(ackSeg) kcp.output.Write(ackSeg)
kcp.receivingUpdated = false kcp.receivingUpdated = false
} }
//}
// calculate window size // calculate window size
cwnd := _imin_(kcp.snd_una+kcp.snd_wnd, kcp.rmt_wnd) cwnd := _imin_(kcp.snd_una+kcp.snd_wnd, kcp.rmt_wnd)

@ -59,7 +59,7 @@ func (this *ACKList) Add(number uint32, timestamp uint32) {
this.numbers = append(this.numbers, number) this.numbers = append(this.numbers, number)
} }
func (this *ACKList) Clear(una uint32) { func (this *ACKList) Clear(una uint32) bool {
count := 0 count := 0
for i := 0; i < len(this.numbers); i++ { for i := 0; i < len(this.numbers); i++ {
if this.numbers[i] >= una { if this.numbers[i] >= una {
@ -70,8 +70,12 @@ func (this *ACKList) Clear(una uint32) {
count++ count++
} }
} }
if count < len(this.numbers) {
this.numbers = this.numbers[:count] this.numbers = this.numbers[:count]
this.timestamps = this.timestamps[:count] this.timestamps = this.timestamps[:count]
return true
}
return false
} }
func (this *ACKList) AsSegment() *ACKSegment { func (this *ACKList) AsSegment() *ACKSegment {

Loading…
Cancel
Save