iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >网络端口的转发和重定向(Python)
  • 565
分享到

网络端口的转发和重定向(Python)

端口重定向网络 2023-01-31 02:01:30 565人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

【任务】    需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。【解决方案】    两个使用threading和Socket模块的类就能完成我们需要的端口转发和重定向。#encod

【任务】

    需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。

【解决方案】

    两个使用threading和Socket模块的类就能完成我们需要的端口转发和重定向。

#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 Cookbook(第2版)中文版》


相关阅读:端口转发(linux/windows


*** walker ***


--结束END--

本文标题: 网络端口的转发和重定向(Python)

本文链接: https://www.lsjlt.com/news/186007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作