具备简单的管理功能,运行后 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()
|