private (IPEndPoint LocalEndPoint, UdpClientModel UdpModel) AddUdpClientToDictionary(UdpClient udpClient) { var localEndPoint = udpClient.Client.LocalEndPoint as IPEndPoint; if (localEndPoint == null) { throw new InvalidOperationException($"Can't convert {udpClient.Client.LocalEndPoint} to IPEndPoint"); } if (_udpModels.ContainsKey(localEndPoint) == true) { throw new InvalidOperationException($"UdpClient with port = {udpClient.Client.LocalEndPoint} already exists"); } var udpModel = new UdpClientModel { StoppingTokenSource = new CancellationTokenSource(), UdpClient = udpClient }; var isAdded = _udpModels.TryAdd(localEndPoint, udpModel); if (isAdded == false) { throw new InvalidOperationException($"Can't add udpClient to dictionary udpModels"); } return(localEndPoint, udpModel); }
private bool StopReceivingInternal(UdpClientModel udpModel, int timeoutInMilliseconds = 300) { if (udpModel.ReceiveTask == null) { return(false); } var status = udpModel.ReceiveTask.Status; if (status != TaskStatus.Canceled && status != TaskStatus.Faulted && status != TaskStatus.RanToCompletion) { udpModel.StoppingTokenSource.Cancel(); udpModel.StoppingTokenSource = new CancellationTokenSource(); var taskDelay = Task.Delay(timeoutInMilliseconds); taskDelay.Wait(); return(true); } return(false); }
private void ProcessRecieve(UdpClientModel udpModel, Func <IPEndPoint, byte[], IPEndPoint, Task <byte[]> > onReceiveFuncAsunc, int?receiveTimeoutInMilliseconds) { StopReceivingInternal(udpModel); udpModel.ReceiveTask = udpModel.UdpClient.ReceiveAsync(); udpModel.UdpClient.BeginReceive() if (udpModel.StoppingTokenSource.IsCancellationRequested == true) { udpModel.StoppingTokenSource = new CancellationTokenSource(); } try { if (receiveTimeoutInMilliseconds > 0) { udpModel.ReceiveTask.Wait(receiveTimeoutInMilliseconds.Value, udpModel.StoppingTokenSource.Token); } else { udpModel.ReceiveTask.Wait(udpModel.StoppingTokenSource.Token); } } // *** If cancellation is requested, an OperationCanceledException results. catch (OperationCanceledException) { udpModel.ReceiveTask = null; return; } if (udpModel.ReceiveTask.IsCanceled == true) { udpModel.ReceiveTask = null; return; } if (udpModel.ReceiveTask.Exception != null) { var exception = udpModel.ReceiveTask.Exception; udpModel.ReceiveTask = null; throw exception; } var receiveResult = udpModel.ReceiveTask.Result; udpModel.ReceiveTask = null; var executeTask = onReceiveFuncAsunc(udpModel.UdpClient.Client.LocalEndPoint as IPEndPoint, receiveResult.Buffer, receiveResult.RemoteEndPoint); if (executeTask != null) { executeTask.Wait(); } var onReceivedResult = executeTask.Result; if (onReceivedResult != null) { var sendTask = udpModel.UdpClient.SendAsync(onReceivedResult, onReceivedResult.Length, receiveResult.RemoteEndPoint); sendTask.Wait(); } }