Python port forwarding/multiplexing server

前端 未结 3 1112
广开言路
广开言路 2021-02-03 11:02

I would like to make server that listen on UDP port 162 (SNMP trap) and then forwards this traffic to multiple clients. Also important is that the source port & address stay

3条回答
  •  醉酒成梦
    2021-02-03 11:46

    The accepted answer didn't work for me and I end up using A simple TCP redirector in python :

    #!/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    '
            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()
    

提交回复
热议问题