ここに新しいユーザーがいます。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で発生し続けます。何が問題なの?
また、追加の質問、私はバックログを設定する必要がありますか?
なぜ「SocketException」に特別なキャッチがありますか? 'catch(Exception)'に落とすと、実際のエラーメッセージが表示され、何が起こっているのかが分かりやすくなります。 –
私はネイティブソケットエラーコードが必要だったので、私はSocketExceptionのための特別なキャストを作った。私は多くのコーディング経験を持っていないので、特別なキャッチがこのキャッチに最適だろうと思いました。 –
Listen(int.MaxValue)を使用します。 –