2013-06-04 2 views
1

Я пытаюсь сделать что-то очень простое, что не работает: с моим приложением C# я просто хочу слушать пакеты UDP на конкретном порту. С Wireshark я очень хорошо вижу, что пакеты, которые мне нужны, получаются отлично (CRC и все в порядке).Приложение C#, просто не получающее данные UDP

Однако ни один из кодов, которые я нашел в Интернете, не работает. Например, эта ошибка также не удалась:

private void ReceiveAsync() 
    { 

     UdpClient Client = new UdpClient(new IPEndPoint(IPAddress.Any, 51200)); 

     try 
     { 
      Client.BeginReceive(new AsyncCallback(OnReceive), null); 
     } 
     catch (Exception e) 
     { 
      System.Windows.Forms.MessageBox.Show(e.Message); 
     } 
    } 

    private static void OnReceive(IAsyncResult result) 
    { 
     System.Windows.Forms.MessageBox.Show("Simply to tell you that something was received on the port"); 
    } 

Установлены две сетевые карты Ethernet. Может быть, это может быть проблемой? Но даже если я конкретно укажу IP-адрес, это ничего не изменит.

  UdpClient Client = new UdpClient(new IPEndPoint(IPAddress.Parse("10.0.0.2"), 51200)); 

Я был бы очень рад любым идеям, которые могли бы решить эту проблему. Большое спасибо!

+0

Если это не получится получить в течение 24 часов, я поставлю щедрость. – Renan

+0

'OnReceive' не будет вызываться в контексте пользовательского интерфейса (он будет работать в потоке ThreadPool), поэтому отображение MessageBox может быть ненадежным. Замените это с помощью Debug.WriteLine и запустите в отладчике и отправьте. – spender

+0

Вы вызываете BeginReceive(), но никогда EndReceive()? Я думаю, вам нужно передать объект Client в OnReceiveMethod для вызова client.EndReceive() есть – C4stor

ответ

2

Код в порядке и работоспособности - я его протестировал.

Вам нужно ждать полученных данных, Client объект существует только в ReceiveAsync

Попробуйте добавить Thread.Sleep(10000)

Edit:
Thread.Sleep(1000) не является хорошей практикой, так как он блокирует поток.
это зависит от проблемы/дела, которую вы пытаетесь решить. у вас может быть какой-то механизм TCP, который обрабатывает несколько соединений или обработку данных, поэтому вы можете сказать данные о буфере для какого-то другого потока, над которым нужно работать.

Если вы разделяете проблему, которую вы пытаетесь решить, может быть, может дать лучший ответ Также можно увидеть пример кода из MSDN - UdpClient.BeginReceive

+0

Спасибо, что проверили его! Я разрешаю коду работать как часть приложения Forms, поэтому мне не нужно позволять приложению спать. – user1192475

+0

, поэтому я думаю, что вам нужно сохранить «Клиент» в качестве члена - см. Мой комментарий в ответе – Mzf

0

Я нашел эту тему здесь

Receive messages continuously using udpClient

мая это поможет.

  1. вы действительно не должны показывать окно сообщения, подумайте о выходе отладки.
  2. Сохраните введенные данные непосредственно после получения, чтобы избежать блокировки сети.
+1

К настоящему моменту я попробовал две версии кода, которые, как представляется, получают пакеты UDP совершенно нормально, когда пакеты UDP были отправлены, например, из другого приложения. Пакеты, которые я хочу получить, они отправляются на ПК с платы FPGA ... Может быть, у кого-нибудь из вас есть идея, почему вместо этого игнорируются? По словам Вирешарка, они отлично сформировались ... – user1192475