示例#1
0
        private async void NetworkClient_OnDisconnected(object sender, Network.Events.DisconnectedEventArgs e)
        {
#pragma warning disable CS4014
            Task.Run(() => OnNetworkClientDisconnected?.Invoke(this, new DisconnectedEventArgs()));
#pragma warning restore CS4014

            IsConnected = false;

            try {
                while (!await AttemptConnectAsync(true))
                {
                    await Task.Delay(1000).WithCancellation(_clientCancellationToken.Token);
                }
            } catch (OperationCanceledException ex) {
                // Catch, consume, adapt, overcome
            }
        }
 public async Task DisconnectAsync(int delay)
 {
     Client.logout();
     isConnected = false;
     OnNetworkClientDisconnected?.Invoke(this, EventArgs.Empty);
 }
示例#3
0
        /// <summary>
        /// Main message received loop
        /// </summary>
        private void MessageRetrieveCallback(IAsyncResult AsyncResult)
        {
            if (Stopping)
            {
                return;
            }

            bool StatusOK;

            try
            {
                if (UseSSL)
                {
                    StatusOK = SSLStream.EndRead(AsyncResult) != 0;
                }
                else
                {
                    StatusOK = BaseSocket.EndReceive(AsyncResult, out var ErrorCode) != 0 && ErrorCode == SocketError.Success;
                }
            }
            catch
            {
                StatusOK = false;
            }

            // Check the message state to see if we've been disconnected
            if (!StatusOK)
            {
                OnNetworkClientDisconnected?.Start(this, new OnNetworkClientDisconnectedEventArgs(BaseSocket?.RemoteEndPoint));
                this.Close();
                return;
            }

            // Take our initial first 4 bytes we've received so we know how large the actual message is
            var BufferLength = BitConverter.ToInt32(NextBufferLength, 0);

            NextBufferLength = new byte[4];

            var Buffer = new byte[BufferLength];

            var BytesReceived = 0;

            while (BytesReceived < BufferLength)
            {
                var BytesReceiving = this.Receive(Buffer, BytesReceived, BufferLength - BytesReceived, SocketFlags.None, out var ErrorCode);
                if (ErrorCode != SocketError.Success)
                {
                    OnNetworkExceptionOccurred?.Start(this, new OnNetworkExceptionOccurredEventArgs(new Exception($"Invalid ammount of data received from Client! Expected {BufferLength} got {BytesReceived} with exception {ErrorCode}")));
                    BeginAcceptMessages();
                    return;
                }
                else
                {
                    BytesReceived += BytesReceiving;
                }
            }

            // Deserialize the decrypted message into a raw object array
            NetworkEvent DeserializedEvent;

            try
            {
                DeserializedEvent = SerializationProdiver.Deserialize <NetworkEvent>(Buffer);
            }
            catch
            {
                OnNetworkExceptionOccurred?.Start(this, new OnNetworkExceptionOccurredEventArgs(new Exception($"Corrupted data received!")));
                BeginAcceptMessages();
                return;
            }

            // Notify that we've received a network event
            OnNetworkMessageReceived?.Start(this, new OnNetworkMessageReceivedEventArgs(DeserializedEvent));

            // Loop
            if (ContinueSubscribing)
            {
                BeginAcceptMessages();
            }
        }
示例#4
0
 protected override void OnClientStoppedHandlingMessages()
 {
     OnNetworkClientDisconnected?.Invoke(this, EventArgs.Empty);
 }