diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-08-15 16:51:29 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-08-15 16:51:29 -0700 |
commit | 41e7af7eeb7f0d0a3991abd7ff87177308570c54 (patch) | |
tree | 3c0684b6549c0e186032ca38252bc40fc4657273 /tests/sockets/socket_relay.py | |
parent | b1eaf55eefb815e8f3556b59ce64e6d1e0f55d55 (diff) | |
parent | 2e229a560955c07d1b66db27913af3284baa64fb (diff) |
Merge branch 'incoming'
Diffstat (limited to 'tests/sockets/socket_relay.py')
-rw-r--r-- | tests/sockets/socket_relay.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/sockets/socket_relay.py b/tests/sockets/socket_relay.py new file mode 100644 index 00000000..5b6403f9 --- /dev/null +++ b/tests/sockets/socket_relay.py @@ -0,0 +1,56 @@ +''' +Listens on 2 ports and relays between them. + +Listens to ports A and B. When someone connects to port A, and then +sends some data to port A, that data is sent to someone who +connected to socket B. And so forth. + +This is different than say socat which will listen to one port +and then make a connection to another port, and do bidirectional +communication. We need to actually listen on both ports. +''' + +import os, sys, socket, time, threading, signal +from subprocess import Popen, PIPE, STDOUT + +ports = [int(sys.argv[1]), int(sys.argv[2])] + +class Listener(threading.Thread): + def run(self): + self.conn = None + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + global ports + port = ports[0] + ports = ports[1:] + print 'listener binding to ', port + s.bind(('127.0.0.1', port)) + s.listen(1) + print 'listener', port, 'waiting for connection' + conn, addr = s.accept() + self.conn = conn + while 1: + time.sleep(0.5) + print 'listener', port, 'waiting for data' + data = conn.recv(20*1024) + if not data: + continue + while not self.other.conn: + print 'listener', port, 'waiting for other connection in order to send data' + time.sleep(1) + print 'listener', port, 'sending data', len(data) + self.other.conn.send(data) + +in_listener = Listener() +in_listener.daemon = True +in_listener.start() + +out_listener = Listener() +out_listener.daemon = True +out_listener.start() + +in_listener.other = out_listener +out_listener.other = in_listener + +while 1: + time.sleep(1) + |