减少套接字连接超时
问题:通过套接字连接到无法访问的 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中文网其他相关文章!