UDPClient теряет соединение после получения нескольких сообщений - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь получить некоторые данные, которые передаются через UDP-сервер многоадресной рассылки. Я кодировал C# Приложение WPF, где я могу ввести порт и IP-адрес сервера. Соединение с сервером установлено успешно, и я могу получать несколько пакетов данных (от 50 до 500 пакетов, меняется при каждой попытке)

Я вызываю функцию приема через диспетчер каждые 33 мс. Более длительное время между событием диспетчера не решает проблему.

Через несколько секунд UDPClient теряет соединение, данные не могут быть получены и больше не могут быть установлены.

Вот функция кнопки, устанавливающей соединение и запускающей диспетчер:

public int connectToArtWelder()
        {
            if (!checkIPAddress())
            {
                MessageBox.Show("Please enter a valid IP-Address.", "Wrong IP-Address", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            else
            {
                string iPString = tB_weldConIP.Text;
                int port = Convert.ToInt32(tB_weldConPort.Text);
                IPAddress iPAddress = IPAddress.Parse(iPString);
                udpClient.Connect(iPAddress, port);

                try
                {
                    dispatcherTimer2.Tick += new EventHandler(Receive);
                    dispatcherTimer2.Interval = new TimeSpan(0, 0, 0, 0, 33);
                    dispatcherTimer2.Start();
                }
                catch
                {

                }
            }
            return 0;
        }

Вот функция приема:

    private void Receive(object sender, EventArgs e)
    {
        try
        {
            int condition = udpClient.Available;
            if (condition > 0)
            { 
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            var asyncResult = udpClient.BeginReceive(null, null);
            asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(10));
                if (asyncResult.IsCompleted)
                {
                    byte[] receiveBytes = udpClient.EndReceive(asyncResult, ref RemoteIpEndPoint);
                    double[] d = new double[receiveBytes.Length / 8];
                    // Do something with data
                }
            }
            else
            {
                // The operation wasn't completed before the timeout and we're off the hook
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

Пожалуйста, дайте мне знать, если у кого-то есть такая же проблема или решение моей проблемы.

1 Ответ

0 голосов
/ 16 января 2020

РЕШЕНИЕ: Я только что удалил команду

udpClient.Connect(ipAddress, port);

, и теперь она работает очень гладко.

...