In which a socket connects to itself. http://www.johncalsbeek.com/2014/10/19/simultaneous-initiation.html
import socket | |
create_socket = lambda: socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) | |
target_port = 49400 # Any port in the ephemeral port range that no process on your machine is using. | |
port = 0 | |
# Create and bind sockets, working our way through the ephemeral port space, until we get close to our target. | |
while not (target_port - 5 < port < target_port): | |
sock = create_socket() | |
sock.bind(('127.0.0.1', 0)) | |
host, port = sock.getsockname() | |
print("Skipping port {}...".format(port)) | |
# For the last few ports, try to connect to the target port. | |
# On Mac OS X 10.10 (14A389), I get: Unable to connect to port 49400, used local port 49400: [Errno 22] Invalid argument | |
# On Windows 8.1 (6.3.9600.17328), I get: Connected to port 49400, used local port 49400 | |
while port < target_port: | |
sock = create_socket() | |
try: | |
sock.connect(('127.0.0.1', target_port)) | |
host, port = sock.getsockname() | |
print("Connected to port {}, used local port {}".format(target_port, port)) | |
except socket.error as e: | |
host, port = sock.getsockname() | |
print("Unable to connect to port {}, used local port {}: {}".format(target_port, port, e)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment