Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) 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:
IncludeFile "CkSocket.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. socket.i = CkSocket::ckCreate() If socket.i = 0 Debug "Failed to create object." ProcedureReturn EndIf tls.i = 0 maxWaitMillisec.i = 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.i = CkSocket::ckConnect(socket,"192.168.1.137",6660,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 = CkSocket::ckConnect(socket,"192.168.1.188",80,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 = 1 success = CkSocket::ckConnect(socket,"192.168.1.188",80,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 = 0 success = CkSocket::ckConnect(socket,"pop3.btconnect.com",25,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 = CkSocket::ckConnect(socket,"192.168.1.127",22,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 = CkSocket::ckConnect(socket,"www.thisdoesnotresolvetoanyipaddressxyz.com",22,tls,maxWaitMillisec) Debug CkSocket::ckLastErrorText(socket) ; 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 CkSocket::ckDispose(socket) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.