Welcome, guest | Sign In | My Account | Store | Cart
import socket,asyncore

class forwarder(asyncore.dispatcher):
   
def __init__(self, ip, port, remoteip,remoteport,backlog=5):
        asyncore
.dispatcher.__init__(self)
       
self.remoteip=remoteip
       
self.remoteport=remoteport
       
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
       
self.set_reuse_addr()
       
self.bind((ip,port))
       
self.listen(backlog)

   
def handle_accept(self):
        conn
, addr = self.accept()
       
# print '--- Connect --- '
        sender
(receiver(conn),self.remoteip,self.remoteport)

class receiver(asyncore.dispatcher):
   
def __init__(self,conn):
        asyncore
.dispatcher.__init__(self,conn)
       
self.from_remote_buffer=''
       
self.to_remote_buffer=''
       
self.sender=None

   
def handle_connect(self):
       
pass

   
def handle_read(self):
        read
= self.recv(4096)
       
# print '%04i -->'%len(read)
       
self.from_remote_buffer += read

   
def writable(self):
       
return (len(self.to_remote_buffer) > 0)

   
def handle_write(self):
        sent
= self.send(self.to_remote_buffer)
       
# print '%04i <--'%sent
       
self.to_remote_buffer = self.to_remote_buffer[sent:]

   
def handle_close(self):
       
self.close()
       
if self.sender:
           
self.sender.close()

class sender(asyncore.dispatcher):
   
def __init__(self, receiver, remoteaddr,remoteport):
        asyncore
.dispatcher.__init__(self)
       
self.receiver=receiver
        receiver
.sender=self
       
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
       
self.connect((remoteaddr, remoteport))

   
def handle_connect(self):
       
pass

   
def handle_read(self):
        read
= self.recv(4096)
       
# print '<-- %04i'%len(read)
       
self.receiver.to_remote_buffer += read

   
def writable(self):
       
return (len(self.receiver.from_remote_buffer) > 0)

   
def handle_write(self):
        sent
= self.send(self.receiver.from_remote_buffer)
       
# print '--> %04i'%sent
       
self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:]

   
def handle_close(self):
       
self.close()
       
self.receiver.close()

if __name__=='__main__':
   
import optparse
    parser
= optparse.OptionParser()

    parser
.add_option(
       
'-l','--local-ip',
        dest
='local_ip',default='127.0.0.1',
        help
='Local IP address to bind to')
    parser
.add_option(
       
'-p','--local-port',
        type
='int',dest='local_port',default=80,
        help
='Local port to bind to')
    parser
.add_option(
       
'-r','--remote-ip',dest='remote_ip',
        help
='Local IP address to bind to')
    parser
.add_option(
       
'-P','--remote-port',
        type
='int',dest='remote_port',default=80,
        help
='Remote port to bind to')
    options
, args = parser.parse_args()

    forwarder
(options.local_ip,options.local_port,options.remote_ip,options.remote_port)
    asyncore
.loop()

History

  • revision 2 (18 years ago)
  • previous revisions are not available