mirror of
https://github.com/sshuttle/sshuttle.git
synced 2024-11-25 09:23:48 +01:00
ca7d38dc1a
This version is a bit limited: it always only connects back to itself, which is always on 127.0.0.1. It also doesn't really find any problems, other than odd behaviour when Linux runs out of available port numbers after a while.
87 lines
2.5 KiB
Python
Executable File
87 lines
2.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
import sys, os, socket, select, struct, time
|
|
|
|
listener = socket.socket()
|
|
listener.bind(('127.0.0.1', 0))
|
|
listener.listen(500)
|
|
|
|
servers = []
|
|
clients = []
|
|
remain = {}
|
|
|
|
NUMCLIENTS = 50
|
|
count = 0
|
|
|
|
|
|
while 1:
|
|
if len(clients) < NUMCLIENTS:
|
|
c = socket.socket()
|
|
c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
c.bind(('0.0.0.0', 0))
|
|
c.connect(listener.getsockname())
|
|
count += 1
|
|
if count >= 16384:
|
|
count = 1
|
|
print 'cli CREATING %d' % count
|
|
b = struct.pack('I', count) + 'x'*count
|
|
remain[c] = count
|
|
print 'cli >> %r' % len(b)
|
|
c.send(b)
|
|
c.shutdown(socket.SHUT_WR)
|
|
clients.append(c)
|
|
r = [listener]
|
|
time.sleep(0.1)
|
|
else:
|
|
r = [listener]+servers+clients
|
|
print 'select(%d)' % len(r)
|
|
r,w,x = select.select(r, [], [], 5)
|
|
assert(r)
|
|
for i in r:
|
|
if i == listener:
|
|
s,addr = listener.accept()
|
|
servers.append(s)
|
|
elif i in servers:
|
|
b = i.recv(4096)
|
|
print 'srv << %r' % len(b)
|
|
if not i in remain:
|
|
assert(len(b) >= 4)
|
|
want = struct.unpack('I', b[:4])[0]
|
|
b = b[4:]
|
|
#i.send('y'*want)
|
|
else:
|
|
want = remain[i]
|
|
if want < len(b):
|
|
print 'weird wanted %d bytes, got %d: %r' % (want, len(b), b)
|
|
assert(want >= len(b))
|
|
want -= len(b)
|
|
remain[i] = want
|
|
if not b: # EOF
|
|
if want:
|
|
print 'weird: eof but wanted %d more' % want
|
|
assert(want == 0)
|
|
i.close()
|
|
servers.remove(i)
|
|
del remain[i]
|
|
else:
|
|
print 'srv >> %r' % len(b)
|
|
i.send('y'*len(b))
|
|
if not want:
|
|
i.shutdown(socket.SHUT_WR)
|
|
elif i in clients:
|
|
b = i.recv(4096)
|
|
print 'cli << %r' % len(b)
|
|
want = remain[i]
|
|
if want < len(b):
|
|
print 'weird wanted %d bytes, got %d: %r' % (want, len(b), b)
|
|
assert(want >= len(b))
|
|
want -= len(b)
|
|
remain[i] = want
|
|
if not b: # EOF
|
|
if want:
|
|
print 'weird: eof but wanted %d more' % want
|
|
assert(want == 0)
|
|
i.close()
|
|
clients.remove(i)
|
|
del remain[i]
|
|
listener.accept()
|