欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)端口轉發(fā)器的方法

 更新時間:2015年03月13日 15:19:06   作者:chongq  
這篇文章主要介紹了python實現(xiàn)端口轉發(fā)器的方法,涉及Python實現(xiàn)端口轉發(fā)的技巧,支持TCP和UDP協(xié)議,需要的朋友可以參考下

本文實例講述了python實現(xiàn)端口轉發(fā)器的方法。分享給大家供大家參考。具體如下:

下面的python代碼實現(xiàn)端口轉發(fā)器,支持udp端口轉發(fā)

由于工作需要用到一個端口轉發(fā)器,并且要求支持TCP和UDP協(xié)議。在網上找了蠻久,但沒有中意的。于是就自己寫了一個。這個轉發(fā)器是基于python cookbook的一個示例改寫的,原先的這個示例只支持TCP協(xié)議,我這里增加了UDP協(xié)議的支持,程序寫的不怎么好,不過它確實能用!

portmap.py代碼如下:

復制代碼 代碼如下:
#-* -coding: UTF-8 -* -
'''
Created on 2012-5-8
@author: qh
'''
import time,socket,threading
def log(strLog):
    strs=time.strftime("%Y-%m-%d %H:%M:%S")
    print strs+"->"+strLog
class pipethread(threading.Thread):
    '''
    classdocs
    '''
    def __init__(self,source,sink):
        '''
        Constructor
        '''
        threading.Thread.__init__(self)
        self.source=source
        self.sink=sink
        log("New Pipe create:%s->%s" % (self.source.getpeername(),self.sink.getpeername()))
    def run(self):
        while True:
            try:
                data=self.source.recv(1024)
                if not data: break
                self.sink.send(data)
            except Exception ,ex:
                log("redirect error:"+str(ex))
                break
        self.source.close()
        self.sink.close()
class portmap(threading.Thread):
    def __init__(self,port,newhost,newport,local_ip=''):
        threading.Thread.__init__(self)
        self.newhost=newhost
        self.newport=newport
        self.port=port
        self.local_ip=local_ip
        self.sock=None
        self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.sock.bind((self.local_ip,port))
        self.sock.listen(5)
        log("start listen protocol:%s,port:%d " % ('tcp',port))
    def run(self):
        while True:
            fwd=None
            newsock=None
            newsock,address=self.sock.accept()
            log("new connection->protocol:%s,local port:%d,remote address:%s" % ('tcp',self.port,address[0]))
            fwd=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            try:
                fwd.connect((self.newhost,self.newport))
            except Exception ,ex:
                log("connet newhost error:"+str(ex))
                break
            p1=pipethread(newsock,fwd,self.protocol)
            p1.start()
            p2=pipethread(fwd,newsock,self.protocol)
            p2.start()
class pipethreadUDP(threading.Thread):
    def __init__(self,connection,connectionTable,table_lock):
        threading.Thread.__init__(self)
        self.connection=connection
        self.connectionTable=connectionTable
        self.table_lock=table_lock
        log('new thread for new connction')
    def run(self):
        while True:
            try:
                data,addr=self.connection['socket'].recvfrom(4096)
                #log('recv from addr"%s' % str(addr))
            except Exception ,ex:
                log("recvfrom error:"+str(ex))
                break
            try:
                self.connection['lock'].acquire()
                self.connection['Serversocket'].sendto(data,self.connection['address'])
                #log('sendto address:%s' % str(self.connection['address']))
            except Exception ,ex:
                log("sendto error:"+str(ex))
                break
            finally:self.connection['lock'].release()
            self.connection['time']=time.time()
        self.connection['socket'].close()
        log("thread exit for: %s" % str(self.connection['address']))
        self.table_lock.acquire()
        self.connectionTable.pop(self.connection['address'])
        self.table_lock.release()
        log('Release udp connection for timeout:%s' % str(self.connection['address']))
class portmapUDP(threading.Thread):
    def __init__(self,port,newhost,newport,local_ip=''):
        threading.Thread.__init__(self)
        self.newhost=newhost
        self.newport=newport
        self.port=port
        self.local_ip=local_ip
        self.sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.sock.bind((self.local_ip,port))
        self.connetcTable={}
        self.port_lock=threading.Lock()
        self.table_lock=threading.Lock()
        self.timeout=300
        #ScanUDP(self.connetcTable,self.table_lock).start()
        log('udp port redirect run->local_ip:%s,local_port:%d,remote_ip:%s,remote_port:%d' % (local_ip,port,newhost,newport))
    def run(self):
        while True:
            data,addr=self.sock.recvfrom(4096)
            connection=None
            newsock=None
            self.table_lock.acquire()
            connection=self.connetcTable.get(addr)
            newconn=False
            if connection is None:
                connection={}
                connection['address']=addr
                newsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
                newsock.settimeout(self.timeout)
                connection['socket']=newsock
                connection['lock']=self.port_lock
                connection['Serversocket']=self.sock
                connection['time']=time.time()
                newconn=True
                log('new connection:%s' % str(addr))
            self.table_lock.release()
            try:
                connection['socket'].sendto(data,(self.newhost,self.newport))
            except Exception ,ex:
                log("sendto error:"+str(ex))
                #break
            if newconn:
                self.connetcTable[addr]=connection
                t1=pipethreadUDP(connection,self.connetcTable,self.table_lock)
                t1.start()
        log('main thread exit')
        for key in self.connetcTable.keys():
            self.connetcTable[key]['socket'].close()
if __name__=='__main__':
    myp=portmapUDP(10061,'10.0.1.29',161)
    myp.start()
    #myp.__stop()

希望本文所述對大家的Python程序設計有所幫助。

相關文章

  • Django集成富文本編輯器summernote的實現(xiàn)步驟

    Django集成富文本編輯器summernote的實現(xiàn)步驟

    在最近的項目中小編使用了這個富文本編輯器,選擇它的主要原因是配置非常簡單,默認支持普通用戶上傳圖片(不像ckeditor默認只有staff user才能上傳圖片。如果要讓普通用戶上傳圖片,還需修改源碼裝飾器)?,F(xiàn)在讓我們來看看如何使用這個富文本編輯器
    2021-05-05
  • django批量導入xml數(shù)據(jù)

    django批量導入xml數(shù)據(jù)

    從網上下載的一些數(shù)據(jù),excel表格,xml文件,txt文件等有時候我們想把它導入數(shù)據(jù)庫,應該如何操作呢?下面我們就來詳細討論下。
    2016-10-10
  • python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解

    python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解

    這篇文章主要為大家介紹了python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • python3.6.5基于kerberos認證的hive和hdfs連接調用方式

    python3.6.5基于kerberos認證的hive和hdfs連接調用方式

    這篇文章主要介紹了python3.6.5基于kerberos認證的hive和hdfs連接調用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 淺談python3打包與拆包在函數(shù)的應用詳解

    淺談python3打包與拆包在函數(shù)的應用詳解

    這篇文章主要介紹了淺談python3打包與拆包在函數(shù)的應用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Python 通過調用接口獲取公交信息的實例

    Python 通過調用接口獲取公交信息的實例

    今天小編就為大家分享一篇Python 通過調用接口獲取公交信息的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python面向對象之內置函數(shù)相關知識總結

    Python面向對象之內置函數(shù)相關知識總結

    本次要總結的的內置函數(shù)共8個,他們都跟面向對象的知識相關,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Pyhton中單行和多行注釋的使用方法及規(guī)范

    Pyhton中單行和多行注釋的使用方法及規(guī)范

    大家都知道python中的注釋有多種,有單行注釋,多行注釋,批量注釋,中文注釋也是常用的。python注釋也有自己的規(guī)范,這篇文章文章中會給大家詳細介紹Pyhton中單行和多行注釋的使用方法及規(guī)范,有需要朋友們可以參考借鑒。
    2016-10-10
  • Pytorch使用卷積神經網絡對CIFAR10圖片進行分類方式

    Pytorch使用卷積神經網絡對CIFAR10圖片進行分類方式

    這篇文章主要介紹了Pytorch使用卷積神經網絡對CIFAR10圖片進行分類方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于Python實現(xiàn)撲克牌面試題

    基于Python實現(xiàn)撲克牌面試題

    這篇文章主要介紹了基于Python實現(xiàn)撲克牌面試題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12

最新評論