tags:

views:

378

answers:

1

Hi all,

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 solution is to have a new proxy server that will just redirect all packets from client to destination server. The new proxy server has good connection to both locations.

So far I have found Simple UDP proxy/pipe

Are there some tools for such purpose ?

Cheers

A: 

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()
Alex