public void Recv() { if (this.socket == null) { return; } while (socket != null && this.socket.Available > 0) { int messageLength = 0; try { messageLength = this.socket.ReceiveFrom(this.cache, ref this.ipEndPoint); } catch (Exception e) { Log.Exception(e); continue; } // 长度小于1,不是正常的消息 if (messageLength < 1) { continue; } // accept byte flag = this.cache[0]; // conn从1000开始,如果为1,2,3则是特殊包 uint remoteConn = 0; uint localConn = 0; KChannel kChannel = null; switch (flag) { case KcpProtocalType.SYN: // accept // 长度!=5,不是accpet消息 if (messageLength != 5) { break; } IPEndPoint acceptIpEndPoint = (IPEndPoint)this.ipEndPoint; this.ipEndPoint = new IPEndPoint(0, 0); remoteConn = BitConverter.ToUInt32(this.cache, 1); // 如果已经收到连接,则忽略 if (this.waitConnectChannels.TryGetValue(remoteConn, out kChannel)) { break; } localConn = ++this.IdGenerater; kChannel = new KChannel(localConn, remoteConn, this.socket, acceptIpEndPoint, this); this.localConnChannels[kChannel.LocalConn] = kChannel; this.waitConnectChannels[remoteConn] = kChannel; this.OnAccept(kChannel); break; case KcpProtocalType.ACK: // connect返回 // 长度!=9,不是connect消息 if (messageLength != 9) { break; } remoteConn = BitConverter.ToUInt32(this.cache, 1); localConn = BitConverter.ToUInt32(this.cache, 5); kChannel = this.GetKChannel(localConn); if (kChannel != null) { kChannel.HandleConnnect(remoteConn); } break; case KcpProtocalType.FIN: // 断开 // 长度!=13,不是DisConnect消息 if (messageLength != 13) { break; } remoteConn = BitConverter.ToUInt32(this.cache, 1); localConn = BitConverter.ToUInt32(this.cache, 5); // 处理chanel kChannel = this.GetKChannel(localConn); if (kChannel != null) { // 校验remoteConn,防止第三方攻击 if (kChannel.RemoteConn == remoteConn) { kChannel.Disconnect(ErrorCode.ERR_PeerDisconnect); } } break; case KcpProtocalType.MSG: // 断开 // 长度<9,不是Msg消息 if (messageLength < 9) { break; } // 处理chanel remoteConn = BitConverter.ToUInt32(this.cache, 1); localConn = BitConverter.ToUInt32(this.cache, 5); this.waitConnectChannels.Remove(remoteConn); kChannel = this.GetKChannel(localConn); if (kChannel != null) { // 校验remoteConn,防止第三方攻击 if (kChannel.RemoteConn == remoteConn) { kChannel.HandleRecv(this.cache, 5, messageLength - 5); } } break; } } }