Reduzierung von Zeitüberschreitungen bei Socket-Verbindungen
Das Problem: Das Herstellen einer Verbindung zu einer nicht erreichbaren IP-Adresse über einen Socket führt häufig zu übermäßig langen Zeitüberschreitungen (z. B. 15 Sekunden). Dieser Artikel zeigt, wie Sie diese Verzögerung verkürzen können.
Originalcode:
<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>
Verbesserte Lösung: Die Methoden BeginConnect
und EndConnect
bieten mehr Kontrolle über das Timeout-Verhalten. BeginConnect
ermöglicht die Angabe einer Timeout-Dauer.
<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>
Dieser überarbeitete Code versucht eine Verbindung mit einem Zeitlimit von 5 Sekunden herzustellen. Wenn die Verbindung innerhalb dieses Zeitraums fehlschlägt, wird eine Ausnahme ausgelöst und der Socket wird explizit geschlossen. Dies verhindert Ressourcenlecks und verbessert die Reaktionsfähigkeit.
Das obige ist der detaillierte Inhalt vonWie kann das Socket-Connect-Timeout reduziert werden, wenn eine Verbindung zu einer nicht verbundenen IP-Adresse hergestellt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!