rendered paste body#! /usr/bin/env python#-*- coding: utf-8 -*-import socketimport threadingclass PipeThread(threading.Thread): pipes = [] def __init__(self, sockInput, sockOutput, name): threading.Thread.__init__(self) self.setName(name) self.pipes.append(self) self.mydata = threading.local() self.sockInput = sockInput self.sockOutput = sockOutput def run(self): print self.getName(), "started !!" while True: try: self.mydata.buffer = self.sockInput.recv(1024) if not self.mydata.buffer: break; print self.getName(), " :", self.mydata.buffer[0:48] self.sockOutput.send(self.mydata.buffer) except: break print self.getName(), "ended !!" self.sockInput.close() self.sockOutput.close() self.pipes.remove(self)class PipeHole(threading.Thread): def __init__(self, portInput, host, portOutput): threading.Thread.__init__(self) print "Redirecting : localhost:%s -> %s:%s" % (portInput, host, portOutput) self.hostname = hostname self.portOutput = portOutput # Wait for incomings clients self.sockMaster = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sockMaster.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sockMaster.bind(('', portInput)) self.sockMaster.listen(5) print "Server is ready !!" def run(self): print "Accepting connections !!" while True: # Accept a client connection sockClient, addr = self.sockMaster.accept() sRemote = socket.gethostbyaddr(addr[0]) print "Connection :", sRemote[0], sRemote[2] , ":", sockClient.getpeername()[1] # Connect to server sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sockServer.connect((self.hostname, self.portOutput)) PipeThread(sockClient, sockServer, "Client").start() PipeThread(sockServer, sockClient, "Server").start() self.sockMaster.close()if __name__ == '__main__': import sys try: port = int(sys.argv[1]) hostname = sys.argv[2] try: new_port = int(sys.argv[3]) except IndexError: new_port = port except (IndexError, ValueError): print "Usage: %s port hostname [new_port]" % sys.argv[0] sys.exit(1) mainThread = PipeHole(port, hostname, new_port) mainThread.start() mainThread.join() print "Shutting down !!" #sys.exit(0)