python的网络应用_使用Python编写网络应用

#!/usr/bin/python

#coding=utf-8

importsocketimportsysimportthreadingdefserver_loop(local_host,local_port,remote_host,remote_port,receive_first):

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:

server.bind((local_host,local_port))except:print "[!!] Failed to listen on %s:%d"%(local_host,local_port)print "[!!] Check for other listening sockets or correct permissions."sys.exit(0)print "[*] Listening on %s:%d"%(local_host,local_port)

server.listen(5)whileTrue:

client_socket, addr=server.accept()#打印出本地连接信息

print "[==>] Received incoming connection from %s:%d"%(addr[0],addr[1])#开启一个线程与远程主机通信

proxy_thread = threading.Thread(target=proxy_handler,args=(client_socket,remote_host,remote_port,receive_first))

proxy_thread.start()defproxy_handler(client_socket,remote_host,remote_port,receive_first):#连接远程主机

remote_socket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)

remote_socket.connect((remote_host,remote_port))#如果必要从远程主机接收数据

ifreceive_first:

remote_buffer=receive_from(remote_socket)

hexdump(remote_buffer)#发送给我们的响应数据

remote_buffer =response_handler(remote_buffer)#如果我们有数据传递给本地客户端,发送它

iflen(remote_buffer):print "[<==] Sending %d bytes to localhost."%len(remote_buffer)

client_socket.send(remote_buffer)#现在我们从本地循环读取数据,发送给远程主机和本地主机

whileTrue:#从本地读取主机

local_buffer =receive_from(client_socket)iflen(local_buffer):print "[==>] Received %d bytes from localhost."%len(local_buffer)

hexdump(local_buffer)#发送给我们的本地请求

local_buffer =request_handler(local_buffer)#向远程主机发送数据

remote_socket.send(local_buffer)print "[==>] Sent to remote ."

#接受响应的数据

remote_buffer =receive_from(remote_socket)iflen(remote_buffer):print "[<==] Received %d bytes from remote ."%len(remote_buffer)

hexdump(remote_buffer)#发送到响应处理函数

remote_buffer =response_handler(remote_buffer)#将响应发送给本地socket

client_socket.send(remote_buffer)print "[<==] Sent to localhost."

#如果两边都没有数据,关闭连接

if not len(local_buffer) or notlen(remote_buffer):

client_socket.close()

remote_socket.close()print "[*] No more data. Closing cnnections."

break

#十六进制导出函数

def hexdump(src,length=16):

result=[]

digits= 4 if isinstance(src,unicode) else 2

for i inxrange(0,len(src),length):

s= src[i:i+length]

hexa= b' '.join(["%0*X" % (digits,ord(x)) for x ins])

text= b''.join([x if 0x20 <= ord(x) < 0x7F else b'.' for x ins])

result.append( b"%04X %-*s %s" % (i,length*(digits + 1),hexa,text))print b'\n'.join(result)defreceive_from(connection):

buffer= ""

#我们设置了两秒的超时,这取决于目标的情况,可能需要调整

connection.settimeout(2)try:#持续从缓存中读取数据直到没有数据或超时

whileTrue:

data= connection.recv(4096)if notdata:breakbuffer+=dataexcept:pass

returnbuffer#对目标是远程主机的请求进行修改

defrequest_handler(buffer):#执行包修改

returnbuffer#对目标是本地主机的响应进行修改

defresponse_handler(buffer):#执行包修改

returnbufferdefmain():

if len(sys.argv[1:]) != 5:print "Usage : ./tcp_agent.py [localhost] [localport] [remotehost] [remoteport] [receive_first]"

print "Example : ./tcp_agent.py 127.0.0.1 9000 10.12.132.1 9000 True"sys.exit(0)#设置本地监听参数

local_host = sys.argv[1]

local_port= int(sys.argv[2])#设置远程目标

remote_host = sys.argv[3]

remote_port= int(sys.argv[4])#告诉代理在发送给远程主机之前连接和接收数据

receive_first = sys.argv[5]if "True" inreceive_first:

receive_first=Trueelse:

receive_first=False#现在设置好我们的监听socket

server_loop(local_host,local_port,remote_host,remote_port,receive_first)

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值