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