TCP features

April 6, 2013, 1:02 p.m.

После того, как @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)
comments powered by Disqus