2014-09-10 40 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,這將獲取下一組數據。