Beispiel #1
0
        protected void AsyncProcessQueue()
        {
            if (_closed.Value)
            {
                return;
            }

            if (_isWritingAsync.Exchange(true))
            {
                return;
            }

            MessageBuffer buffer = null;

            if (!_writeQueue.TryPeek(out buffer))
            {
                _isWritingAsync.Exchange(false);
                return;
            }

            try
            {
                _socket.BeginSend(buffer.Data(), buffer.Rpos(), buffer.GetActiveSize(),
                                  SocketFlags.None, out _error, SendDataCallback, null);
            }
            catch (Exception ex)
            {
                CloseSocket();

                if (LogException)
                {
                    if (NetSettings.Logger != null)
                    {
                        NetSettings.Logger.Warn(ex);
                    }
                    else
                    {
                        Console.WriteLine(ex);
                    }
                }
            }
        }
Beispiel #2
0
        protected override void ReadHandler()
        {
            MessageBuffer buffer = GetReadBuffer();

            while (buffer.GetActiveSize() > 0)
            {
                int size = RecvHeaderSize;

                if (buffer.GetActiveSize() < size)
                {
                    break;
                }

                // We just received nice new header
                if (!_NextPacketDecrypted)
                {
                    _authCrypt.DecryptRecv(buffer.Data(), buffer.Rpos(), size);
                }
                _NextPacketDecrypted = false;

                var addr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer.Data(), buffer.Rpos());

                int  packetId;
                bool compressed;

                if (ServerSocket)
                {
                    var header = Marshal.PtrToStructure <ClientPacketHeader>(addr);
                    size       = header.Size + sizeof(ushort);
                    packetId   = header.PacketId;
                    compressed = header.Compressed != 0;
                }
                else
                {
                    var header = Marshal.PtrToStructure <ServerPacketHeader>(addr);
                    size       = header.Size + sizeof(int);
                    packetId   = header.PacketId;
                    compressed = header.Compressed != 0;
                }

                var packetType = ObjectPacket.GetPacketType(packetId);

                if (packetType == null || size <= 0 || size >= _MaxPacketSize)
                {
                    if (LogException)
                    {
                        var message = string.Format("Client {0} sent malformed packet (size: {1}, packetId: {2}).", RemoteAddress, size, packetId);

                        if (NetSettings.Logger != null)
                        {
                            NetSettings.Logger.Warn(message);
                        }
                        else
                        {
                            Console.WriteLine(message);
                        }
                    }

                    if (CloseOnMalformedPacket)
                    {
                        CloseSocket();
                        return;
                    }
                    else
                    {
                        // Buffer are corrupted, reset!
                        buffer.Reset();
                        continue;
                    }
                }

                if (buffer.GetActiveSize() < size)
                {
                    // NOTE: The header buffer of next upcoming packet is already decrypted in above code.
                    // We must skip _authCrypt.DecryptRecv() for next packet.
                    _NextPacketDecrypted = true;
                    break;
                }

                buffer.ReadCompleted(RecvHeaderSize);
                size -= RecvHeaderSize;
                DeserializePacket(packetType, compressed, size, buffer);
            }

            AsyncRead();
        }
Beispiel #3
0
        public void QueuePacket(MessageBuffer buffer)
        {
            _writeQueue.Enqueue(buffer);

            AsyncProcessQueue();
        }
Beispiel #4
0
        private void WriteHandlerInternal(IAsyncResult result)
        {
            switch (_error)
            {
            case SocketError.Success:
            case SocketError.IOPending:
                break;

            default:
                CloseSocket();
                return;
            }

            try
            {
                var transferedBytes = _socket.EndSend(result);
                TotalBytesSent += transferedBytes;

                MessageBuffer buffer = null;
                if (!_writeQueue.TryPeek(out buffer))
                {
                    throw new ApplicationException("BaseSocket: _writeQueue.TryPeek() failed, which is impossible!");
                }

                buffer.ReadCompleted(transferedBytes);

                if (buffer.GetActiveSize() <= 0)
                {
                    if (!_writeQueue.TryDequeue(out buffer))
                    {
                        throw new ApplicationException("BaseSocket: _writeQueue.TryDequeue() failed, which is impossible!");
                    }
                }

                _isWritingAsync.Exchange(false);

                if (!_writeQueue.IsEmpty)
                {
                    AsyncProcessQueue();
                }
                else if (_closing)
                {
                    CloseSocket();
                }
            }
            catch (Exception ex)
            {
                CloseSocket();

                if (LogException)
                {
                    if (NetSettings.Logger != null)
                    {
                        NetSettings.Logger.Warn(ex);
                    }
                    else
                    {
                        Console.WriteLine(ex);
                    }
                }
            }
        }
Beispiel #5
0
 public ByteBuffer(MessageBuffer buffer)
 {
     _rpos    = 0;
     _wpos    = 0;
     _storage = buffer.Move();
 }