Python 簡單的代理服務器

具備簡單的管理功能,運行後 telnet localhost 9000 端口可以進行管理主要功能就是做包轉發,如果有一個橋服務器,可以用來外網訪問內網用,還是很管用的

#/bin/env python   
002 #coding:utf-8   
003    
004 import socket,select,sys,time   
005 import thread   
006    
007 s_list =[]   
008    
009 def 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    
049 def 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    
064 def 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 
102 exit\r 
103     exit telnet\r 
104 start localport serverip:serverport\r 
105     start a new server\r 
106 list\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    
136 def 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    
155 if __name__ =='__main__':   
156    
157     start= 0  
158    
159     main()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章