2013-07-11 2 views
0

Я пытаюсь узнать, как использовать BeginReceive для UDP, вот что у меня есть:C# BeginReceive для UDP

 Console.WriteLine("Initializing SNMP Listener on Port:" + port + "..."); 
     UdpClient client = new UdpClient(port); 
     //UdpState state = new UdpState(client, remoteSender); 


     try 
     { 
      client.BeginReceive(new AsyncCallback(recv), null); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 


    } 

    private static void recv(IAsyncResult res) 
    { 
     int port = 162; 
     UdpClient client = new UdpClient(port); 
     IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 162); 
     byte[] received = client.EndReceive(res, ref RemoteIpEndPoint); 
     Console.WriteLine(Encoding.UTF8.GetString(received)); 
     client.BeginReceive(new AsyncCallback(recv), null); 

    } 

Ничего не происходит, код просто конец, даже не вызвав метод ПРИЕМ. Почему это ?

Edit:

Добавлено: -

Console.ReadLine(); 

Теперь это дает мне исключение в строке ниже:

Only one usage of each socket address is normally permitted. 

Опробование: -

 try 
     { 
      client.BeginReceive(new AsyncCallback(recv), client); 
     } 

    private static void recv(IAsyncResult res) 
    { 
    // int port = 162; 

     try 
     { 
      IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 162); 
      byte[] received = res.AsyncState.EndReceive(res, ref RemoteIpEndPoint); 
      Console.WriteLine(Encoding.UTF8.GetString(received)); 
      res.AsyncState.BeginReceive(new AsyncCallback(recv), null); 

     } 

     catch (Exception e) 
     { 
      Console.WriteLine(e); 

     } 

Ошибка:

'object' does not contain a definition for 'EndReceive' and no extension method 'EndReceive' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 
+0

ли вы его останова перед отправкой на этот вопрос? Смотрите, что происходит? Смотрите, где это происходит неправильно? –

ответ

1

Если первая часть кода, по существу, тело вашей основной функции вы не должны удивляться тому, что она заканчивается. Поместите

Console.Readline(); 

перед закрытием } из main ждать.

recv будет вызываться асинхронно, как только будут получены некоторые данные. Затем вам нужно прочитать полученные данные от самого UDP-клиента, который ждал. Чтобы получить доступ к этому клиенту вы Сдать с помощью государственного параметра BeginReceive

client.BeginReceive(new AsyncCallback(recv), client); 

и, наконец, получить от обратных вызовов параметра IAsyncResult

UdpClient client = (UdpClient)res.AsyncState; 

Это может быть проще (но менее гибкий) для хранения клиента в поле класса.

Теперь вы получаете ваши данные

byte[] received = client.EndReceive(res, ref RemoteIpEndPoint); 
+0

Я сделал это, давая мне исключение в UdpClient client = new UdpClient (порт); – user726720

+0

Тогда порт, вероятно, используется. Выберите другой. Однако на самом деле это не связано. – JeffRSon

+0

Я открываю порт в основном, как ссылку на вызов beginreceive, затем я делаю это снова в recv, это не допускается. – user726720