public void HandleRecv(byte[] date, int offset, int length) { if (this.IsDisposed) { return; } this.IsConnected = true; Kcp.KcpInput(this.kcp, date, offset, length); this.Service.AddToUpdateNextTime(0, this.Id); while (true) { if (this.IsDisposed) { break; } int n = Kcp.KcpPeeksize(this.kcp); if (n < 0) { break; } if (n == 0) { this.OnError((int)SocketError.NetworkReset); break; } MemoryStream ms = MessageSerializeHelper.GetStream(n); ms.SetLength(n); ms.Seek(0, SeekOrigin.Begin); byte[] buffer = ms.GetBuffer(); int count = Kcp.KcpRecv(this.kcp, buffer, n); if (n != count) { break; } switch (this.Service.ServiceType) { case ServiceType.Inner: ms.Seek(Packet.ActorIdLength + Packet.OpcodeLength, SeekOrigin.Begin); break; case ServiceType.Outer: ms.Seek(Packet.OpcodeLength, SeekOrigin.Begin); break; } this.lastRecvTime = this.Service.TimeNow; this.OnRead(ms); } }
public void HandleRecv(byte[] date, int offset, int length) { if (this.IsDisposed) { return; } this.isConnected = true; Kcp.KcpInput(this.kcp, date, offset, length); this.GetService().AddToUpdateNextTime(0, this.Id); while (true) { if (this.IsDisposed) { return; } int n = Kcp.KcpPeeksize(this.kcp); if (n < 0) { return; } if (n == 0) { this.OnError((int)SocketError.NetworkReset); return; } byte[] buffer = this.memoryStream.GetBuffer(); this.memoryStream.SetLength(n); this.memoryStream.Seek(0, SeekOrigin.Begin); int count = Kcp.KcpRecv(this.kcp, buffer, ushort.MaxValue); if (n != count) { return; } if (count <= 0) { return; } this.lastRecvTime = this.GetService().TimeNow; this.OnRead(this.memoryStream); } }
public void HandleRecv(byte[] date, int offset, int length) { if (this.IsDisposed) { return; } this.IsConnected = true; Kcp.KcpInput(this.kcp, date, offset, length); this.Service.AddToUpdateNextTime(0, this.Id); while (true) { if (this.IsDisposed) { break; } int n = Kcp.KcpPeeksize(this.kcp); if (n < 0) { break; } if (n == 0) { this.OnError((int)SocketError.NetworkReset); return; } if (this.needReadSplitCount > 0) // 说明消息分片了 { byte[] buffer = readMemory.GetBuffer(); int count = Kcp.KcpRecv(this.kcp, buffer, (int)this.readMemory.Length - this.needReadSplitCount, n); this.needReadSplitCount -= count; if (n != count) { Log.Error($"kchannel read error1: {this.LocalConn} {this.RemoteConn}"); this.OnError(ErrorCore.ERR_KcpReadNotSame); return; } if (this.needReadSplitCount < 0) { Log.Error($"kchannel read error2: {this.LocalConn} {this.RemoteConn}"); this.OnError(ErrorCore.ERR_KcpSplitError); return; } // 没有读完 if (this.needReadSplitCount != 0) { continue; } } else { this.readMemory = this.ms; this.readMemory.SetLength(n); this.readMemory.Seek(0, SeekOrigin.Begin); byte[] buffer = readMemory.GetBuffer(); int count = Kcp.KcpRecv(this.kcp, buffer, 0, n); if (n != count) { break; } // 判断是不是分片 if (n == 8) { int headInt = BitConverter.ToInt32(this.readMemory.GetBuffer(), 0); if (headInt == 0) { this.needReadSplitCount = BitConverter.ToInt32(readMemory.GetBuffer(), 4); if (this.needReadSplitCount <= maxPacketSize) { Log.Error($"kchannel read error3: {this.needReadSplitCount} {this.LocalConn} {this.RemoteConn}"); this.OnError(ErrorCore.ERR_KcpSplitCountError); return; } this.readMemory = new MemoryStream(this.needReadSplitCount); this.readMemory.SetLength(this.needReadSplitCount); this.readMemory.Seek(0, SeekOrigin.Begin); continue; } } } switch (this.Service.ServiceType) { case ServiceType.Inner: this.readMemory.Seek(Packet.ActorIdLength + Packet.OpcodeLength, SeekOrigin.Begin); break; case ServiceType.Outer: this.readMemory.Seek(Packet.OpcodeLength, SeekOrigin.Begin); break; } this.lastRecvTime = this.Service.TimeNow; MemoryStream mem = this.readMemory; this.readMemory = null; this.OnRead(mem); } }