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