TcpClient#Connect のタイムアウト制御
TcpClient でコネクションを張る際の接続時タイムアウトをユーザコードで任意に指定しようとすると、次のようなコードが今風(C# 5.0 以降風)なのだろうか?
try { int timeout = 接続タイムアウト(ms); TcpClient client = new TcpClient(); Task con_task = client.ConnectAsync(remote_addr, remote_port); if (!con_task.Wait(timeout)) // 接続拒否などは AggregateException { client.Close(); throw new SocketException(10060); // 10060 -> WSAETIMEDOUT } // ※接続後の処理 } catch (SocketException e) { // timeout でのタイムアウト } catch (AggregateException e) { if (e.InnerException is SocketException) { // 接続失敗 拒否されたか Socket でのタイムアウト } }
※timeout にシステムデフォルトのタイムアウト時間(約21秒)より長い時間を指定した場合は、システムデフォルト値が優先されます。
timeout 優先にしようとすると、リトライ処理を書くことになりそうな
例外が SocketException と AggregateException に割れるのも美しくない…