이 문서의 예에서는 Python에서 네트워크 포트 전달 및 리디렉션을 구현하는 방법을 설명합니다. 참고를 위해 모두와 공유합니다. 세부 사항은 다음과 같습니다.
[작업]
특정 네트워크 포트를 다른 호스트로 전달(전달)해야 하지만 그럴 수도 있습니다. 다른 포트(리디렉션)
[해결책]
스레딩 및 소켓 모듈을 사용하는 두 클래스는 필요한 포트 전달 및 리디렉션을 완료할 수 있습니다.
#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()
[토론]
작은 네트워크라도 관리하다 보면 포트 포워딩이나 리다이렉션 기능이 가끔은 좋을 때가 있다. 당신에게 도움이됩니다. 귀하가 제어할 수 없는 일부 응용 프로그램이나 서비스는 특정 서버 주소나 포트에 내장되어 있을 수 있습니다. 전달 및 리디렉션을 삽입하면 애플리케이션에 대한 연결 요청을 보다 적절한 다른 호스트 또는 포트로 보낼 수 있습니다.
Python에서 네트워크 포트 전달 및 리디렉션을 구현하는 방법에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!