После того, как @bay прочитал весь RFC по TCP, он опубликовал у себя очень интересные примеры, что TCP сокет может подсоединиться сам к себе, и что можно соединить два сокета без вызовов listen и accept.
Connect to self
import socket
import random
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
try:
port = random.randrange(1024, 65536)
s.connect(("0.0.0.0", port))
print("%s" % port)
print("SUCCESS, SENDING BAY")
s.send("BAY")
data = s.recv(10000)
print("GOT %s" % data)
break
except Exception as E:
pass
Connect to self plain
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("127.0.0.1", 3255))
s.connect(("127.0.0.1", 3255))
print("SUCCESS, SENDING BAY")
s.send("BAY")
data = s.recv(10000)
print("GOT %s" % data)
No listen
import socket
import os
import sys
while True:
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s1.bind(("127.0.0.1", 3255))
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s2.bind(("127.0.0.1", 3256))
if os.fork() == 0:
s2.close()
try:
s1.connect(("127.0.0.1", 3256))
print("SUCCESS, SENDING BAY")
s1.send("BAY")
s1.close()
sys.exit(0)
except Exception as E:
print(E)
else:
s1.close()
try:
s2.connect(("127.0.0.1", 3255))
print("SUCCESS, RECV")
data = s2.recv(10000)
print("GOT %s" % data)
except Exception as E:
print(E)
finally:
sys.exit(0)