具備簡單的管理功能,運行後 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 |
while True :
|
021 |
|
022 |
rl,wl,xl =
select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()]) |
023 |
|
024 |
if len (xl) >
0 :
|
025 |
cs.close() |
026 |
ts.close() |
027 |
print '%s %d closed.'
% addr |
028 |
sys.exit( 0 ) |
029 |
|
030 |
if len (rl) >
0 :
|
031 |
if rl[ 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 |
if len ( 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 |
global s_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 |
while True :
|
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 |
global start,s_list
|
066 |
|
067 |
ss =
socket.socket() |
068 |
ss.bind(( '0.0.0.0' ,l_port)) |
069 |
ss.listen( 10 ) |
070 |
|
071 |
while True :
|
072 |
cs,addr =
ss.accept() |
073 |
cs.send( """trans server 1.0\r\ntype 'help' to get help\r\n""" ) |
074 |
buffer =
'' |
075 |
while True :
|
076 |
buf =
cs.recv( 10000 ) |
077 |
if len (buf)
= =
0 : |
078 |
cs.close() |
079 |
break |
080 |
if buf[ - 1 ] not
in ( '\r' , '\n' ): |
081 |
buffer + =
buf |
082 |
continue |
083 |
buffer + =
buf |
084 |
cmd =
buffer .strip() |
085 |
buffer =
'' |
086 |
if cmd
= = 'exit' :
|
087 |
cs.close() |
088 |
break |
089 |
elif cmd
= = 'stop' :
|
090 |
start =
0 |
091 |
cs.close() |
092 |
sys.exit( 0 ) |
093 |
elif cmd
= = 'list' :
|
094 |
b =
'' |
095 |
for l
in s_list:
|
096 |
b + = '%4d %s:%d\r\n'
% l |
097 |
|
098 |
if len (b) >
0 :
|
099 |
cs.send(b) |
100 |
elif cmd
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 |
if len (cmds) >
1 and
cmds[ 0 ]
= =
'start' :
|
113 |
args =
cmds[ 1 ].strip().split( " " , 1 ) |
114 |
if len (args) ! = 2 :
|
115 |
cs.send( 'start localport serverip:serverport\r\n' ) |
116 |
continue |
117 |
arg =
args[ 1 ].split( ":" , 1 ) |
118 |
if len (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 |
global start
|
138 |
|
139 |
if len (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 |
while start:
|
153 |
time.sleep( 1 ) |
154 |
|
155 |
if
__name__ = = '__main__' :
|
156 |
|
157 |
start =
0 |
158 |
|
159 |
main() |