Esempio n. 1
0
        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);
                    }
                }
            }
        }
Esempio n. 2
0
        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);
        }