English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Metodi per implementare la trasmissione e la reindirizzamento dei porti di rete in Python

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.

Ti potrebbe interessare