Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(Excel) Socket Connect Failure CasesDemonstrates a few common situations that would cause a TCP connect to a remote host:port to fail, an examines the LastErrorText for each case. This example discusses the following cases:
' This example requires the Chilkat API to have been previously unlocked. ' See Global Unlock Sample for sample code. Dim socket As Chilkat.Socket Set socket = Chilkat.NewSocket tls = False maxWaitMillisec = 5000 ' First test the case where the remote host is not listening on the desired port. ' In this case, my LAN has a computer at 192.168.1.137, but nothing on that computer ' is listening for inbound connection to port 6660. success = socket.Connect("192.168.1.137",6660,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' The call to Connect should fail quickly, and the LastErrorText will contain ' a message about the connection being rejected: ' ' socket2Connect: ' connect2: ' ConnectFailReason: Connection rejected ' --connect2 ' --socket2Connect ' Now test the case where there is no computer on the network at the desired IP address. ' For example, on my LAN, there is no computer at 192.168.1.188. If ping is used to test, ' the error message would be "Destination host unreachable". success = socket.Connect("192.168.1.188",80,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' In this case, the connection is "rejected" as before, but the connect hangs for the entire ' maximum waiting period (maxWaitMillisec), which is 5 seconds in this case. ' (If the maxWaitMillisec is a large enough amount of time, the operating system ' may fail the connect with a "connection rejected" after a long wait. ' The difference is that when the remote host exists and is reachable, the failure is quick.) ' The portion of the LastErrorText for this failure is shown here: ' connectInner: ' hostname: 192.168.1.188 ' port: 80 ' tls: 0 ' maxWaitMs: 5000 ' socket2Connect: ' connect2: ' connectSocket: ' connect_ipv6_or_ipv4: ' timeout waiting for connect to complete ' numSec: 5 ' numMicroSec: 0 ' failedWaitToConnect: Socket operation timeout. ' --connect_ipv6_or_ipv4 ' --connectSocket ' ConnectFailReason: Timeout ' --connect2 ' --socket2Connect ' Failed. ' --connectInner ' Imagine that a new rule is added to Windows Firewall to block all connections ' for this example app. The characteristics of the failure are the same as for ' the case where nothing on the remote computer is listening at the given port. ' The connection attempt fails immediately, and the error message (from the OS) is ' "connection rejected". Also notice that SSL/TLS never enters the equation because ' the SSL/TLS handshake begins *after* the TCP connection is completed. When the ' TCP connection fails, it never reaches the point of even beginning the SSL/TLS negotiation. tls = True success = socket.Connect("192.168.1.188",80,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' connectInner: ' hostname: smtp.gmail.com ' port: 465 ' tls: 1 ' maxWaitMs: 5000 ' socket2Connect: ' connect2: ' ConnectFailReason: Connection rejected ' --connect2 ' --socket2Connect ' Failed. ' --connectInner ' What about the case where the ISP blocks an outbound connection? My home ISP is ' Comcast cable, and they block outbound SMTP port 25. tls = False success = socket.Connect("pop3.btconnect.com",25,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' The result is a timeout: ' connectInner: ' hostname: pop3.btconnect.com ' port: 25 ' tls: 0 ' maxWaitMs: 5000 ' socket2Connect: ' connect2: ' connectSocket: ' connect_ipv6_or_ipv4: ' timeout waiting for connect to complete ' numSec: 5 ' numMicroSec: 0 ' failedWaitToConnect: Socket operation timeout. ' --connect_ipv6_or_ipv4 ' --connectSocket ' ConnectFailReason: Timeout ' --connect2 ' --socket2Connect ' Failed. ' --connectInner ' What about the case where the Windows Firewall at the remote host is blocking the ' inbound connection. On Chilkat's internal LAN, there is a computer at 192.168.1.127 ' running an SSH server. After adding an inbound rule to block port 22, external connections ' fail with a timeout, as shown below: success = socket.Connect("192.168.1.127",22,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' connectInner: ' hostname: 192.168.1.127 ' port: 22 ' tls: 0 ' maxWaitMs: 5000 ' socket2Connect: ' connect2: ' connectSocket: ' connect_ipv6_or_ipv4: ' timeout waiting for connect to complete ' numSec: 5 ' numMicroSec: 0 ' failedWaitToConnect: Socket operation timeout. ' --connect_ipv6_or_ipv4 ' --connectSocket ' ConnectFailReason: Timeout ' --connect2 ' --socket2Connect ' Failed. ' --connectInner ' Finally, what if we try to connect to a hostname that does not resolve to an IP address? success = socket.Connect("www.thisdoesnotresolvetoanyipaddressxyz.com",22,tls,maxWaitMillisec) Debug.Print socket.LastErrorText ' In this case there is an immediate failure: ' connectInner: ' hostname: www.thisdoesnotresolvetoanyipaddressxyz.com ' port: 22 ' tls: 0 ' maxWaitMs: 5000 ' socket2Connect: ' connect2: ' connectSocket: ' connect_ipv6_or_ipv4: ' resolveHostname6: ' getAddressInfo: ' Failed to get host address info. (3) ' SocketError: WSAHOST_NOT_FOUND No such host is known. ' hostOrIpAddr: www.thisdoesnotresolvetoanyipaddressxyz.com ' port: 22 ' Versions of Windows earlier than Windows XP are limited to handling IPv4 only ' On Windows Server 2003 and Windows XP, IPv6 addresses are returned only if IPv6 is installed on the local computer. ' --getAddressInfo ' --resolveHostname6 ' Domain to IP address resolution failed. ' --connect_ipv6_or_ipv4 ' --connectSocket ' ConnectFailReason: DNS lookup failed ' --connect2 ' --socket2Connect ' Failed. ' --connectInne |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.