2011-10-09 35 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)がソケット例外をトリガーします。エラーコードは10054です。リスナーを再起動するまで、エラーは接続のすべてのattempで発生し続けます。何が問題なの?

また、追加の質問、私はバックログを設定する必要がありますか?

+0

なぜ「SocketException」に特別なキャッチがありますか? 'catch(Exception)'に落とすと、実際のエラーメッセージが表示され、何が起こっているのかが分かりやすくなります。 –

+0

私はネイティブソケットエラーコードが必要だったので、私はSocketExceptionのための特別なキャストを作った。私は多くのコーディング経験を持っていないので、特別なキャッチがこのキャッチに最適だろうと思いました。 –

+0

Listen(int.MaxValue)を使用します。 –

答えて

0

時折の「接続のリセット」は合法です。クライアントは処理を開始する前に接続を閉じている可能性があります。そのエラーが発生した場合でも、引き続き他のリクエストを受け入れる必要があります。 したがって、listener.BeginAcceptfinallyブロックにある必要があります。

+0

迅速な情報のお返事ありがとうございます。私はそれが例外の後で続かないことを気付かなかった、私は日曜日であるので、私の脳はオフになっていると思う。 –

関連する問題