Skip to content

Instantly share code, notes, and snippets.

@habedi
Forked from sivachandran/SimpleTcpRedirector.py
Last active August 29, 2015 14:21
Show Gist options
  • Save habedi/9bd621953b079741e60c to your computer and use it in GitHub Desktop.
Save habedi/9bd621953b079741e60c to your computer and use it in GitHub Desktop.

Revisions

  1. @sivachandran sivachandran created this gist Mar 4, 2012.
    107 changes: 107 additions & 0 deletions SimpleTcpRedirector.py
    Original file line number Diff line number Diff line change
    @@ -0,0 1,107 @@
    #!/usr/bin/env python

    import socket
    import threading
    import select
    import sys

    terminateAll = False

    class ClientThread(threading.Thread):
    def __init__(self, clientSocket, targetHost, targetPort):
    threading.Thread.__init__(self)
    self.__clientSocket = clientSocket
    self.__targetHost = targetHost
    self.__targetPort = targetPort

    def run(self):
    print "Client Thread started"

    self.__clientSocket.setblocking(0)

    targetHostSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    targetHostSocket.connect((self.__targetHost, self.__targetPort))
    targetHostSocket.setblocking(0)

    clientData = ""
    targetHostData = ""
    terminate = False
    while not terminate and not terminateAll:
    inputs = [self.__clientSocket, targetHostSocket]
    outputs = []

    if len(clientData) > 0:
    outputs.append(self.__clientSocket)

    if len(targetHostData) > 0:
    outputs.append(targetHostSocket)

    try:
    inputsReady, outputsReady, errorsReady = select.select(inputs, outputs, [], 1.0)
    except Exception, e:
    print e
    break

    for inp in inputsReady:
    if inp == self.__clientSocket:
    try:
    data = self.__clientSocket.recv(4096)
    except Exception, e:
    print e

    if data != None:
    if len(data) > 0:
    targetHostData = data
    else:
    terminate = True
    elif inp == targetHostSocket:
    try:
    data = targetHostSocket.recv(4096)
    except Exception, e:
    print e

    if data != None:
    if len(data) > 0:
    clientData = data
    else:
    terminate = True

    for out in outputsReady:
    if out == self.__clientSocket and len(clientData) > 0:
    bytesWritten = self.__clientSocket.send(clientData)
    if bytesWritten > 0:
    clientData = clientData[bytesWritten:]
    elif out == targetHostSocket and len(targetHostData) > 0:
    bytesWritten = targetHostSocket.send(targetHostData)
    if bytesWritten > 0:
    targetHostData = targetHostData[bytesWritten:]

    self.__clientSocket.close()
    targetHostSocket.close()
    print "ClienThread terminating"

    if __name__ == '__main__':
    if len(sys.argv) != 5:
    print 'Usage:\n\tpython SimpleTCPRedirector <host> <port> <remote host> <remote port>'
    print 'Example:\n\tpython SimpleTCPRedirector localhost 8080 www.google.com 80'
    sys.exit(0)

    localHost = sys.argv[1]
    localPort = int(sys.argv[2])
    targetHost = sys.argv[3]
    targetPort = int(sys.argv[4])

    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serverSocket.bind((localHost, localPort))
    serverSocket.listen(5)
    print "Waiting for client..."
    while True:
    try:
    clientSocket, address = serverSocket.accept()
    except KeyboardInterrupt:
    print "\nTerminating..."
    terminateAll = True
    break
    ClientThread(clientSocket, targetHost, targetPort).start()

    serverSocket.close()