Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
            }
        }