端口转发

用vb.net写过一个, 效果不太好, 现在用python重写了一下。

#!/usr/bin/python
import sys, socket, threading, subprocess

fromport=80
toport=80
server='twd2.me'
max_conn=100
class TransConn(threading.Thread):
    def __init__(self, fr):
        threading.Thread.__init__(self)
        self.fr=fr
        self.to=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.running=True
    def tran1(self):
        try:
            while self.running:
                print('tran1 - reading')
                r=self.fr.recv(8192)
                print('tran1 - ' + str(len(r)))
                if len(r)<=0:
                    break
                self.to.send(r)
                print('tran1 - ok')
            self.running=False
        except:
            self.running=False
        try:
            #self.to.close()
            self.to.shutdown(socket.SHUT_RDWR)
        except:
            print('to - err')
    def tran2(self):
        try:
            while self.running:
                print('tran2 - reading')
                r=self.to.recv(8192)
                print('tran2 - ' + str(len(r)))
                if len(r)<=0:
                    break
                self.fr.send(r)
                print('tran2 - ok')
            self.running=False
        except:
            self.running=False
        try:
            #self.fr.close()
            self.fr.shutdown(socket.SHUT_RDWR)
        except:
            print('fr - err')
    def run(self):
        try:
            self.to.connect((server, toport))
            #self.fr.settimeout(30)
            #self.to.settimeout(30)
            t1=threading.Thread(target=self.tran1)
            t2=threading.Thread(target=self.tran2)
            t1.start()
            t2.start()
            t1.join()
            t2.join()
            self.running=False
            try:
                self.fr.shutdown(socket.SHUT_RDWR)
            except:
                print('fr - err')
            try:
                self.to.shutdown(socket.SHUT_RDWR)
            except:
                print('to - err')
        except:
            return

def main():
    lst=[]
    print('listening')
    lfd=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    lfd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    lfd.bind(('0.0.0.0', fromport))
    lfd.listen(max_conn)
    while(True):
        conn_fd, addr=lfd.accept()
        print(addr)
        conn=TransConn(conn_fd)
        conn.start()
        lst.append(conn)
        
    
if __name__=='__main__':
    main()

差不多能用。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/2334QrCode