simple udp proxy solution

前端 未结 4 1398
温柔的废话
温柔的废话 2021-02-04 07:47

I am looking for solution that can proxy my udp packets. I have one client sending udp packets to a server. Connection between them is very bad and I get lot of packet loss. One

4条回答
  •  爱一瞬间的悲伤
    2021-02-04 08:19

    Here is Python code written for this purpose:

    import socket
    from threading import Thread
    
    class Proxy(Thread):
        """ used to proxy single udp connection 
        """
        BUFFER_SIZE = 4096 
        def __init__(self, listening_address, forward_address):
            print " Server started on", listening_address
            Thread.__init__(self)
            self.bind = listening_address
            self.target = forward_address
    
        def run(self):
            # listen for incoming connections:
            target = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            target.connect(self.target)
    
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            try:
                s.bind(self.bind)
            except socket.error, err:
                print "Couldn't bind server on %r" % (self.bind, )
                raise SystemExit
            while 1:
                datagram = s.recv(self.BUFFER_SIZE)
                if not datagram:
                    break
                length = len(datagram)
                sent = target.send(datagram)
                if length != sent:
                    print 'cannot send to %r, %r !+ %r' % (self.target, length, sent)
            s.close()
    
    
    if __name__ == "__main__":
        LISTEN = ("0.0.0.0", 8008)
        TARGET = ("localhost", 5084)
        while 1:
            proxy = Proxy(LISTEN, TARGET)
            proxy.start()
            proxy.join()
            print ' [restarting] '
    

    I used this two scripts to test it.

    import socket
    
    target = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    target.connect(("localhost", 8008))
    print 'sending:', target.send("test data: 123456789")
    

    and

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(("localhost", 5084))
    while 1:
        datagram = s.recv(1024)
        if not datagram:
            break
        print repr(datagram)
    
    s.close()
    

提交回复
热议问题