2014-09-10 84 views
-1

我需要一个程序来侦听几台发送了一些UDP状态的机器。我从一个聊天程序中剪切并粘贴了一些东西,并且启动了一些东西,但是在启动时出现错误“由于系统缺少足够的缓冲空间或者队列已满,无法对套接字执行操作”。如果我确定错误,那么一切运作良好。在下面的代码中,如果我删除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)。 – 2014-09-10 15:20:23

+0

删除可怕的CheckForIllegalCrossThreadCalls分配。 (true)循环删除根本错误。您现在可以更好地编写正确的代码。 – 2014-09-10 15:55:35

回答

2

请勿将BeginReceiveFrom置于循环中。自行回收。你需要做的是在OnReceive函数内部放置另一个BeginReceiveFrom,这将获取下一组数据。