private void Receive() { Task onStopTask = Task.Run(() => _onStop.WaitOne()); _onThreadStarted.Set(); while (true) { try { _isSocketReady.WaitOne(); Task <UdpReceiveResult> result = _udpClient.ReceiveAsync(); if (Task.WaitAny(onStopTask, result) == 0) { return; } OnMessageReceived?.Invoke(this, result.Result); } catch (Exception e) { OnMessageReceivedFailure?.Invoke(this, new ReceiveFailureException("UDPClient threw an exception when receiving", e)); RebuildUdpClient(); } } }
protected bool DisposedValue; // To detect redundant calls public UDPNetworking(IPeerIdentification peerName, IPeerManager peerManager, ISerializer serializer, IPEndPoint ipEndPoint) { PeerName = peerName; PeerManager = peerManager; Serializer = serializer; UDPClient = new UDPClient(ipEndPoint); UDPClient.OnMessageReceived += (sender, udpResult) => RecieveMessageAsync(udpResult.Buffer, udpResult.RemoteEndPoint); UDPClient.OnMessageReceivedFailure += (sender, exception) => OnMessageReceivedFailure?.Invoke(sender, exception); UDPClient.OnMessageSendFailure += (sender, exception) => OnMessageSendFailure?.Invoke(sender, exception); UDPClient.WaitForStartup(); }
protected async void RecieveMessageAsync(byte[] messageBytes, IPEndPoint ipEndPoint) { await Task.Run(() => { try { IBaseMessage message = Serializer.Deserialize(messageBytes); if (PeerManager.AddOrUpdatePeer(message.From, ipEndPoint)) { OnNewConnectedPeer?.Invoke(this, message.From); } OnMessageReceived?.Invoke(this, message); } catch (Exception e) { OnMessageReceivedFailure?.Invoke(this, new ReceiveFailureException("Failed deserialising new message", e)); } }); }