Как проверить, отправляются ли данные в порт с помощью C# UdpClient

У меня есть программа, с помощью которой данные передаются с одного компьютера на другой через UDP. Проблема в том, что данные не всегда могут быть отправлены отправляющей программой, и я хочу, чтобы функция получения моей принимающей программы была включена ТОЛЬКО, когда что-то отправляется на указанный порт (в данном случае 5000), в противном случае, когда пользователь пытается получить данные на порту с использованием UdpClient программа вылетает. Например:

    private const int listenPort = 5000;//receiving port
    UdpClient listener = new UdpClient(listenPort);//udclient instance
    IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
    public string received_data;
    public byte[] receive_byte_array;

    private void receiveButton_Click(object sender, RoutedEventArgs e)
    {
        receive_byte_array = listener.Receive(ref groupEP);
        received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length);
        textBox1.Text = received_data.ToString();

    }

Моя проблема заключается в том, что когда данные не отправляются, а пользователь нажимает receiveButton в главном окне, вся моя программа падает. Если быть точным, проблема здесь:
receive_byte_array = listener.Receive(ref groupEP);

Я попытался решить проблему, поместив приведенную выше строку кода в оператор try catch, но даже тогда программа вылетает! Кажется, что просто попытка получить данные на порту IPEndpoint, когда их нет, вызывает ад.

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


person Mohammad Sepahvand    schedule 27.09.2011    source источник
comment
пожалуйста, поделитесь исключением, насколько я знаю, это может быть что-то еще   -  person mtijn    schedule 27.09.2011
comment
@мтджин. Извините за двусмысленность, но я не получаю никаких исключений. Все мое приложение просто зависает, а затем, когда отправляется следующий пакет (из моей программы-отправителя), все снова в порядке. То, как моя программа зависает, похоже, что это вызвано проблемой с потоками.   -  person Mohammad Sepahvand    schedule 27.09.2011


Ответы (1)


основываясь на вашем комментарии, я бы сказал, что программа зависает, потому что она ожидает получения данных. ваш пользовательский интерфейс зависает, потому что вы начали синхронно прослушивать данные из потока пользовательского интерфейса, и теперь он занят прослушиванием данных, а не перерисовкой или обработкой ввода. чтобы исправить это, поместите бит прослушивания в отдельный поток или используйте асинхронный BeginReceive для получения данных.

person mtijn    schedule 27.09.2011