2011-10-09 80 views
1

新用戶到此處的網站。Socket.EndAccept()錯誤10054

我正在研究一個簡單的異步tcp服務器。我的連接監聽器看起來像這樣。

public static bool Listen(int port) 
    { 
     try 
     { 
      IPEndPoint ep = new IPEndPoint(IPAddress.Any, port); 
      listener = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

      listener.Bind(ep); 
      listener.Listen(4); 

      listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
      return true; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Unknown exception: {0}", e.ToString()); 
      return false; 
     } 
    } 

    private static void AcceptCallback(IAsyncResult res) 
    { 
     try 
     { 
      Socket listener = (Socket)res.AsyncState; 
      Socket inSocket = listener.EndAccept(res); 

      Console.WriteLine("Accepted handle: {0}", inSocket.Handle); 

      listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 
     } 
     catch (SocketException se) 
     { 
      Console.WriteLine("SocketException: {0}", se.ErrorCode); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Unknown exception: {0}", e.ToString()); 
     } 
    } 

大多數的正常工作時間,但偶爾listener.EndAccept(RES)觸發socketexception。它具有錯誤代碼10054.然後,每次連接都會一直髮生,直到重新啓動偵聽器。問題是什麼?

另外還有一個問題,我應該如何設置我的積壓?

+0

爲什麼你有'SocketException'的特殊捕獲?如果你讓它陷入'catch(Exception)'中,你會看到實際的錯誤信息並更好地理解正在發生的事情。 –

+0

我爲SocketException做了一個特殊的轉換,因爲我想要原生套接字錯誤代碼。我沒有太多的編碼經驗,所以我認爲一個特殊的捕獲將是這個最好的。 –

+0

使用Listen(int.MaxValue); –

回答

0

偶爾的「連接重置」是合法的。在開始處理之前,客戶端可能已關閉連接。即使您遇到錯誤,您也必須繼續接受其他請求。 因此,listener.BeginAccept應該在finally

+0

感謝您提供快速的信息回覆。我沒有意識到,在例外之後它不會繼續,我想我的大腦因爲是星期天而關閉了。 –

相關問題