2014-09-10 7 views
-1

Мне нужна программа для прослушивания нескольких машин, которые отправляют некоторые UDP по их статусу. Я вырезал и вставлял биты из чат-программы и получал работу, но при запуске я получаю сообщение об ошибке «Операция сокета не может быть выполнена, потому что в системе недостаточно места для буфера или потому, что очередь заполнена». Если I Ok ошибка, тогда все работает хорошо. В приведенном ниже коде, если я удалю While (true), я не получаю ошибку, но я получаю только одну запись. Я думал, но может ошибаться, что обратный вызов будет просто продолжать работать, и каждый раз, когда он получает данные, он отправит его на рассмотрение. Это я верю, где моя проблема, но я не могу понять, как ее исправить, и как я могу получать данные без опроса сокета?C# BeginReceiveFrom дает мне ошибку

private void Form1_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     CheckForIllegalCrossThreadCalls = false; 

     //We are using UDP sockets 
     serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     //Assign the any IP of the machine and listen on port number 701 
     IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 701); 

     //Bind this address to the server 
     serverSocket.Bind(ipEndPoint); 

     IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0); 
     //The epSender identifies the incoming clients 
     EndPoint epSender = (EndPoint)ipeSender; 


     while (true) 
     { 

      //Start receiving data 
      serverSocket.BeginReceiveFrom(byteData, 0, byteData.Length, SocketFlags.None, ref epSender, new AsyncCallback(OnReceive), epSender); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, "SGSServerUDP", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 
+0

Пожалуйста, введите код для 'OnReceive', если возможно [в качестве редактирования вашего вопроса] (http://stackoverflow.com/posts/25769099/edit). –

+0

Удалите ужасное назначение CheckForIllegalCrossThreadCalls. Удалите принципиально неправильный цикл while (true). Теперь у вас будет гораздо больше шансов написать правильный код. –

ответ

2

Не ставьте BeginReceiveFrom в петлю. Верните его само по себе. Вам нужно сделать еще один BeginReceiveFrom внутри функции OnReceive, который будет захватывать следующий набор данных.

Смежные вопросы