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
(MFC) 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:
#include <CkSocket.h> void ChilkatSample(void) { CkString strOut; // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. CkSocket socket; bool tls = false; int 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. bool success = socket.Connect("192.168.1.137",6660,tls,maxWaitMillisec); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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); strOut.append(socket.lastErrorText()); strOut.append("\r\n"); // 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 SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); } |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.