1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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)
|