ソケット接続タイムアウトの削減
問題: ソケット経由で到達不能な IP アドレスに接続すると、非常に長いタイムアウト (例: 15 秒) が発生することがよくあります。この記事では、この遅延を短縮する方法を説明します。
元のコード:
<code class="language-csharp">try { m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(serverIp); int iPortNo = System.Convert.ToInt16(serverPort); IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo); m_clientSocket.Connect(ipEnd); if (m_clientSocket.Connected) { lb_connectStatus.Text = "Connection Established"; WaitForServerData(); } } catch (SocketException se) { lb_connectStatus.Text = "Connection Failed"; MessageBox.Show(se.Message); }</code>
改善された解決策: BeginConnect
メソッドと EndConnect
メソッドにより、タイムアウト動作をより詳細に制御できます。 BeginConnect
では、タイムアウト期間を指定できます。
<code class="language-csharp">Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Set connection timeout (5 seconds) IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null); bool success = result.AsyncWaitHandle.WaitOne(5000, true); // 5000 milliseconds = 5 seconds if (socket.Connected) { socket.EndConnect(result); // ... proceed with connection ... } else { // Crucial: Close the socket to release resources socket.Close(); throw new ApplicationException("Failed to connect to server."); }</code>
この改訂されたコードは、5 秒のタイムアウトで接続を試みます。その時間枠内に接続が失敗した場合、例外がスローされ、ソケットは明示的に閉じられます。 これにより、リソースのリークが防止され、応答性が向上します。
以上が切断された IP アドレスに接続するときにソケット接続タイムアウトを短縮するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。