Python 简单的代理服务器

具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的

#/bin/env python   
002#coding:utf-8   
003   
004import socket,select,sys,time   
005import thread   
006   
007s_list =[]   
008   
009def loop(cs,addr,s_ip,s_port):   
010    print'%s %d connected.' % addr   
011    ts= socket.socket()   
012   
013    try:   
014        ts.connect((s_ip,s_port))   
015    except:   
016        cs.close()   
017        print'%s %d closed.' %addr   
018        sys.exit(0)   
019   
020    whileTrue:   
021   
022        rl,wl,xl= select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()])   
023   
024        iflen(xl) > 0:   
025            cs.close()   
026            ts.close()   
027            print'%s %d closed.' %addr   
028            sys.exit(0)   
029   
030        iflen(rl) > 0:   
031            ifrl[0]==cs.fileno():   
032                rs= ts   
033                ws= cs   
034            else:   
035                rs= cs   
036                ws= ts   
037   
038            try:   
039                buffer= ws.recv(10000)   
040                iflen(buffer)==0:   
041                    raise  
042                rs.send(buffer)   
043            except:   
044                rs.close()   
045                ts.close()   
046                print'%s %d closed.' %addr   
047                sys.exit(0)   
048   
049def mainserver(l_port,s_ip,s_port):   
050    globals_list   
051    try:   
052        ss= socket.socket()   
053        ss.bind(('0.0.0.0',l_port))   
054        ss.listen(10)   
055        s_list.append((l_port,s_ip,s_port))           
056    except:   
057        sys.exit(0)   
058   
059    whileTrue:   
060        cs,addr= ss.accept()   
061   
062        thread.start_new_thread(loop,(cs,addr,s_ip,s_port))   
063   
064def manager(l_port):   
065    globalstart,s_list   
066   
067    ss= socket.socket()   
068    ss.bind(('0.0.0.0',l_port))   
069    ss.listen(10)   
070   
071    whileTrue:   
072        cs,addr= ss.accept()   
073        cs.send("""trans server 1.0\r\ntype 'help' to get help\r\n""")   
074        buffer= ''   
075        whileTrue:   
076            buf= cs.recv(10000)   
077            iflen(buf) == 0:   
078                cs.close()   
079                break  
080            ifbuf[-1]not in('\r','\n'):   
081                buffer+= buf   
082                continue  
083            buffer+= buf   
084            cmd= buffer.strip()   
085            buffer= ''   
086            ifcmd =='exit':   
087                cs.close()   
088                break  
089            elifcmd =='stop':   
090                start= 0  
091                cs.close()   
092                sys.exit(0)   
093            elifcmd =='list':   
094                b= ''   
095                forl in s_list:   
096                    b+='%4d %s:%d\r\n' %l   
097   
098                iflen(b) > 0:   
099                    cs.send(b)   
100            elifcmd in ('help','?'):   
101                cs.send("""-------------------------------------------\r 
102exit\r 
103    exit telnet\r 
104start localport serverip:serverport\r 
105    start a new server\r 
106list\r 
107    list all server\r 
108-------------------------------------------\r 
109""")   
110            else:   
111                cmds= cmd.split(" ",1)   
112                iflen(cmds) > 1 and cmds[0] == 'start':   
113                    args= cmds[1].strip().split(" ",1)   
114                    iflen(args) !=2:   
115                        cs.send('start localport serverip:serverport\r\n')   
116                        continue  
117                    arg= args[1].split(":",1)   
118                    iflen(arg) !=2:   
119                        cs.send('start localport serverip:serverport\r\n')   
120                        continue  
121   
122                    try:   
123                        l_port= int(args[0])   
124                        s_ip= arg[0]   
125                        s_port= int(arg[1])   
126                    except:   
127                        cs.send('start localport serverip:serverport\r\n')   
128                        continue  
129   
130                    thread.start_new_thread(mainserver,(l_port,s_ip,s_port))   
131                    cs.send('start OK!\r\n')   
132                else:   
133                    cs.send('no command [%s]\r\n'% cmd)   
134                    continue  
135   
136def main():   
137    globalstart   
138   
139    iflen(sys.argv) == 3:   
140        try:   
141            l_port= int(sys.argv[1])   
142            s_ip,s_port= sys.argv[2].split(":")   
143            s_port= int(s_port)   
144            thread.start_new_thread(mainserver,(l_port,s_ip,s_port))   
145        except:   
146            pass  
147   
148    start= 1  
149   
150    thread.start_new_thread(manager,(9000,))   
151   
152    whilestart:   
153        time.sleep(1)   
154   
155if __name__ =='__main__':   
156   
157    start= 0  
158   
159    main()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值