前提・実現したいこと
HttpListenerクラスを使用してサーバを立て、HTTPのメッセージを解析しています。
このサーバに接続し、何もせずに2分ほど放置すると、自動的にクライアントが切断されてしまいます。
この 自動的に切断される 状態を回避する方法をご存知でしょうか?
再接続すると問題なく通信でき、この状態を回避できるため、質問に近いかもしれません。
発生している問題・エラーメッセージ
サーバ側では、エラーは発生しませんでした。
クライアント側では、エラーコード10054で返ってきました。
WSAECONNRESET (10054)
意味 : ピアによって接続がリセットされました。
説明 : 既存の接続が、リモート ホストによって強制的に切断されました。このエラーは、通常、リモート ホストのピア プログラムが突然停止された場合、ホストが再起動された場合、またはリモート ホストが強制終了した場合に発生します。リモート ソケットの SO_LINGER オプションの詳細については、setsockopt (Wsapiref_94aa.asp) を参照してください。このエラーは、1 つまたは複数の操作の実行中に keep-alive 動作によってエラーが検出され、そのために接続が切断された場合に発生することもあります。実行中であった操作は、WSAENETRESET で失敗します。以降の操作は、WSAECONNRESET で失敗します。
該当のソースコード
C#
1public class HttpAnalyzer 2{ 3 HttpListener _listener; 4 CancellationTokenSource _cts; 5 6 public void Initialize() 7 { 8 _listener = new HttpListener(); 9 _listener.Prefixes.Add("http://+:51234/"); 10 _cts = new CancellationTokenSource(); 11 } 12 13 public void Start() 14 { 15 _listener.Start(); 16 Console.WriteLine("Start (http://+:51234/)"); 17 18 Task.Factory.StartNew( 19 () => { 20 while (true) { 21 _Listen(); 22 if (_cts.Token.IsCancellationRequested) { 23 return; 24 } 25 } 26 }, 27 _cts.Token 28 ); 29 } 30 31 void _Listen() 32 { 33 try { 34 var context = _listener.GetContext(); 35 } 36 catch (Exception ex) { 37 if (ex is HttpListenerException) { 38 // listener.Close() 39 } 40 else if (ex is InvalidOperationException) { 41 // client 42 } 43 else { 44 Console.WriteLine("Exception: " + ex.Message); 45 throw; 46 } 47 } 48 } 49}
試したこと
- 再接続すると問題なく通信できます。
- Start前にTimeoutManagerプロパティの値を変更してみましたが、変わらず2分後に切断されます。
補足情報(FW/ツールのバージョンなど)
Windows 7 64bit 英語OS
.NET Framework 4 (Visual Studio 2012)