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); }
/// <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(); } }
protected override void OnClientStoppedHandlingMessages() { OnNetworkClientDisconnected?.Invoke(this, EventArgs.Empty); }