減少套接字連線逾時
問題:透過套接字連接到無法存取的 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中文網其他相關文章!