protected async void Listen() { int left = HeaderLength; int read = 0; int offset = 0; PacketType packetType = default; _receiveStream.Position = 0; while (IsConnected) { try { if (left == 0) { if (packetType == default) { packetType = (PacketType)_receiveStream.ReadByte(); _contentLength = _receiveStream.ReadUInt16(); left = _contentLength; continue; } if (Decoders.TryGetValue(packetType, out var handler)) { handler(); } packetType = default; _contentLength = 0; _receiveStream.Position = 0; offset = 0; left = HeaderLength; } var toRead = (int)Math.Min(_receiveBuffer.Length - offset, left); try { read = await _stream.ReadAsync(_receiveBuffer, (int)offset, toRead); } catch (Exception ex) { Close(ex); } if (read == 0) { Close(); } left -= read; offset += read; } catch (Exception ex) { if (IsConnected) { Close(ex); } } } }
public ProtocolSocket(Socket socket) { Socket = socket; _stream = new NetworkStream(socket, false); _sendStream = new BufferMemoryStream(_sendBuffer = new byte[MaxBufferSize]); _receiveStream = new BufferMemoryStream(_receiveBuffer = new byte[MaxBufferSize]); Decoders[PacketType.SendPayload] = () => OnSendPayload?.Invoke(this, _receiveBuffer, HeaderLength, _contentLength); Decoders[PacketType.C2S_KeepAlive] = () => C2S_OnKeepAlive?.Invoke(this); Decoders[PacketType.S2C_StartNewConnection] = () => S2C_OnStartNewConnection?.Invoke(this, _receiveStream.ReadInt32(), _receiveStream.ReadUInt16(), _receiveStream.ReadUInt16()); Decoders[PacketType.C2S_StartRelay] = () => C2S_OnStartRelay?.Invoke(this, _receiveStream.ReadInt32()); Decoders[PacketType.C2S_StartNewConnectionReply] = () => C2S_OnStartNewConnectionReply?.Invoke(this, _receiveStream.ReadInt32(), _receiveStream.ReadUInt16(), _receiveStream.ReadBoolean()); Decoders[PacketType.S2C_KeepAlive] = () => S2C_OnKeepAlive?.Invoke(this); }