Maison >développement back-end >Tutoriel Python >Comment implémenter la redirection et la redirection de port réseau en Python
L'exemple de cet article décrit comment implémenter la redirection et la redirection de port réseau en Python. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
[Tâche]
Besoin de transférer un certain port réseau vers un autre hôte (transfert), mais cela peut être un autre port (redirection).
[Solution]
Deux classes utilisant les modules threading et socket peuvent compléter la redirection et la redirection de port dont nous avons besoin.
#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) #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) #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) #参数为timeout,单位为秒 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() #正向传送 PipeThread(fwd, newsock).start() #逆向传送 if __name__ == '__main__': print('Starting Pinhole port fowarder/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('Usage: %s port newhost [newport]' % sys.argv[0]) sys.exit(1) #sys.stdout = open('pinhole.log', 'w') #将日志写入文件 Pinhole(port, newhost, newport).start()
[Discussion]
Lorsque vous gérez un réseau, même petit, la redirection de port et le reroutage L'orientation cette fonction peut parfois vous être d’une grande aide. Certaines applications ou services qui ne sont pas sous votre contrôle peuvent être câblés à une adresse ou un port de serveur spécifique. En insérant des redirections et des redirections, vous pouvez envoyer des demandes de connexion pour votre application vers d'autres hôtes ou ports plus appropriés.
Pour plus d'articles sur la façon dont Python implémente la redirection et la redirection de port réseau, veuillez prêter attention au site Web PHP chinois !