一个python写的简单的代理服务器

下面是我用python写的一个简单的代理服务器
具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理
主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的


[code="python"]#/bin/env python
#coding:utf-8

import socket,select,sys,time
import thread

s_list = []

def loop(cs,addr,s_ip,s_port):
print '%s %d connected.' % addr
ts = socket.socket()

try:
ts.connect((s_ip,s_port))
except:
cs.close()
print '%s %d closed.' % addr
sys.exit(0)

while True:

rl,wl,xl = select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()])

if len(xl) > 0:
cs.close()
ts.close()
print '%s %d closed.' % addr
sys.exit(0)

if len(rl) > 0:
if rl[0] == cs.fileno():
rs = ts
ws = cs
else:
rs = cs
ws = ts

try:
buffer = ws.recv(10000)
if len(buffer) == 0:
raise
rs.send(buffer)
except:
rs.close()
ts.close()
print '%s %d closed.' % addr
sys.exit(0)

def mainserver(l_port,s_ip,s_port):
global s_list
try:
ss = socket.socket()
ss.bind(('0.0.0.0',l_port))
ss.listen(10)
s_list.append((l_port,s_ip,s_port))
except:
sys.exit(0)

while True:
cs,addr = ss.accept()

thread.start_new_thread(loop,(cs,addr,s_ip,s_port))

def manager(l_port):
global start,s_list

ss = socket.socket()
ss.bind(('0.0.0.0',l_port))
ss.listen(10)

while True:
cs,addr = ss.accept()
cs.send("""trans server 1.0\r\ntype 'help' to get help\r\n""")
buffer = ''
while True:
buf = cs.recv(10000)
if len(buf) == 0:
cs.close()
break
if buf[-1] not in ('\r','\n'):
buffer += buf
continue
buffer += buf
cmd = buffer.strip()
buffer = ''
if cmd == 'exit':
cs.close()
break
elif cmd == 'stop':
start = 0
cs.close()
sys.exit(0)
elif cmd == 'list':
b = ''
for l in s_list:
b += '%4d %s:%d\r\n' % l

if len(b) > 0:
cs.send(b)
elif cmd in ('help','?'):
cs.send("""-------------------------------------------\r
exit\r
exit telnet\r
start localport serverip:serverport\r
start a new server\r
list\r
list all server\r
-------------------------------------------\r
""")
else:
cmds = cmd.split(" ",1)
if len(cmds) > 1 and cmds[0] == 'start':
args = cmds[1].strip().split(" ",1)
if len(args) != 2:
cs.send('start localport serverip:serverport\r\n')
continue
arg = args[1].split(":",1)
if len(arg) != 2:
cs.send('start localport serverip:serverport\r\n')
continue

try:
l_port = int(args[0])
s_ip = arg[0]
s_port = int(arg[1])
except:
cs.send('start localport serverip:serverport\r\n')
continue

thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
cs.send('start OK!\r\n')
else:
cs.send('no command [%s]\r\n' % cmd)
continue

def main():
global start

if len(sys.argv) == 3:
try:
l_port = int(sys.argv[1])
s_ip,s_port = sys.argv[2].split(":")
s_port = int(s_port)
thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
except:
pass

start = 1

thread.start_new_thread(manager,(9000,))

while start:
time.sleep(1)

if __name__ == '__main__':

start = 0

main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值