English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Questo esempio spiega come implementare il trasferimento e la ridirezione dei porti di rete in Python. Condivido questo con tutti voi per riferimento, come segue:
【任务】
bisogna trasportare una porta di rete su un altro host (forwarding), ma potrebbe essere su una porta diversa (redirecting).
【解决方案】
due a due classi utilizzando i moduli threading e socket possiamo completare la nostra necessità di trasporto e ridirezione di porte (adatto per python2/python3).
#encoding=utf8 #author: walker摘自《Python Cookbook(2rd)》 #date: 2015-06-11 #function: 网络端口的转发和重定向(适用于python2/python3) import sys, socket, time, threading LOGGING = True loglock = threading.Lock() #打印日志到标准输出 def log(s, *a): if LOGGING: loglock.acquire() try: print('%s:%s' % (time.ctime(), (s % a))) sys.stdout.flush() finally: loglock.release() class PipeThread(threading.Thread): pipes = [] #静态成员变量,存储通讯的线程编号 pipeslock = threading.Lock() def __init__(self, source, sink): #Thread.__init__(self) # applicable to versions before python2.2 super(PipeThread, self).__init__() self.source = source self.sink = sink log('Creating new pipe thread %s (%s -> %s)', self, source.getpeername(), sink.getpeername()) self.pipeslock.acquire() try: self.pipes.append(self) finally: self.pipeslock.release() self.pipeslock.acquire() try: pipes_now = len(self.pipes) finally: self.pipeslock.release() log('%s pipes now active', pipes_now) def run(self): while True: try: data = self.source.recv(1024) if not data: break self.sink.send(data) except: break log('%s terminating', self) self.pipeslock.acquire() try: self.pipes.remove(self) finally: self.pipeslock.release() self.pipeslock.acquire() try: pipes_left = len(self.pipes) finally: self.pipeslock.release() log('%s pipes still active', pipes_left) class Pinhole(threading.Thread): def __init__(self, port, newhost, newport): #Thread.__init__(self) # applicable to versions before python2.2 super(Pinhole, self).__init__() log('Redirecting: localhost: %s->%s:%s', port, newhost, newport) self.newhost = newhost self.newport = newport self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind(('', port)) self.sock.listen(5) # parameter is timeout, unit is second def run(self): while True: newsock, address = self.sock.accept() log('Creating new session for %s:%s', *address) fwd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) fwd.connect((self.newhost, self.newport)) PipeThread(newsock, fwd).start() # forward transmission PipeThread(fwd, newsock).start() # inverse transmission if __name__ == '__main__': print('Starting Pinhole port forwarder/redirector') try: port = int(sys.argv[1]) newhost = sys.argv[2] try: newport = int(sys.argv[3]) except IndexError: newport = port except (ValueError, IndexError): print('Uso: %s port newhost [newport]' % sys.argv[0]) sys.exit(1) #sys.stdout = open('pinhole.log', 'w') #Scrivi i log nel file Pinhole(port, newhost, newport).start()
Discussione
Quando gestisci una rete, anche una rete piccola, la funzione di reindirizzamento e ridirezione dei porti può essere molto utile. Alcuni applicativi o servizi al di fuori del tuo controllo potrebbero essere collegati in modo fisso a un indirizzo o porta di un server specifico. Inserendo il reindirizzamento e la ridirezione, puoi inviare le richieste di connessione dell'applicazione a altri host o porte più appropriati.
Chi è interessato a ulteriori contenuti relativi a Python può consultare la sezione speciale di questo sito: 'Concetti di manipolazione di URL Python', 'Concetti di programmazione di socket Python', 'Concetti di manipolazione delle immagini Python', 'Corso di strutture dati e algoritmi Python', 'Concetti di utilizzo delle funzioni Python', 'Riassunto delle operazioni di stringa Python', 'Corso classico di introduzione e avanzamento Python' e 'Concetti di manipolazione dei file e delle directory Python'.
Spero che il contenuto di questo articolo possa essere utile per la progettazione di programmi Python di tutti.
Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, di proprietà dei rispettivi autori, il contenuto è stato caricato autonomamente dagli utenti Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di copyright.