Ruby
Ruby
Socket Connect Failure Cases
See more Socket/SSL/TLS Examples
Demonstrates 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:
- The remote host is not listening on the desired port.
- No remote host exists at the IP address (such as on a LAN).
- The local Windows Firewall blocks the outbound connection.
- Your ISP blocks the outbound connection.
- The remote Windows Firewall blocks the inbound connection.
- The domain cannot be resolved to an IP address.
Chilkat Ruby Downloads
require 'chilkat'
success = false
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
socket = Chilkat::CkSocket.new()
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)
print socket.lastErrorText() + "\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)
print socket.lastErrorText() + "\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)
print socket.lastErrorText() + "\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)
print socket.lastErrorText() + "\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)
print socket.lastErrorText() + "\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)
print socket.lastErrorText() + "\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