layout: post
title: Python端口转发
categories: python
description: python进行端口数据转发

keywords: linux,python

一个用Python做端口转发的源码示例

先看代码

date:2017-10-17
author:zhangjianxin

[TOC]

  
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  #www.iplaypy.com  
  
    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()  
  

   留言:

验证成功!
请输入内容!
验证成功!
请输入内容!