用Python 寫一個TCP 伺服器和TCP代理
阿新 • • 發佈:2018-11-01
TCP伺服器
import socket import threading bind_ip="0.0.0.0" bind_port=9999 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind((bind_ip,bind_port)) server.listen(5) print("[*] listening on %s:%d"%(bind_ip,bind_port)) #客戶處理執行緒 def handle_client(client_socket): request=client_socket.recv(1024) print("[*]Received:%s" %request) #返還一個數據包 client_socket.send("ACK!") client_socket.close() while True: client,addr=server.accept() print ("[*]Accepted connection from :%s :%d" %(addr[0],addr[1])) #掛起客戶端執行緒,處理傳入的資料 client_handler=threading.Thread(target=handle_client,args=(client,)) client_handler.start()
TCP代理
import sys import socket import threading def server_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) while True: 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() def main(): #沒有命令列解析 if len(sys.argv[1:])!=5: print("Usage: ./proxy.py[localhost][localport][remotehost][remoteport][receive_first]") print("Example:./proxy.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" in receive_first: receive_first=True else: receive_first=False #現在設定好我們的監聽 socket server_loop(local_host,local_port,remote_host,remote_port,receive_first) main() def proxy_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)) #如果必要從遠端主機接受資料 if receive_first: remote_buffer=receive_from(remote_socket) hexdump(remote_buffer) #傳送給我們的響應處理 remote_buffer=response_handler(remote_buffer) #如果我們有資料傳遞給本地客戶端,傳送它 if len(remote_buffer): print("[<==]Sending %d bytes to localhost."%len(remote_buffer)) client_socket.send(remote_buffer) #從本地迴圈讀取資料,傳送給遠端主機和本地主機 while True: #從本地讀取資料 local_buffer=receive_from(client_socket) if len(local_buffer): print("[==>]Received %d bttes from localhost."% len(local_buffer)) hexdump(locak_buffer) #傳送給我們的本地請求 local_buffer=request_handler(local_buffer) #向遠端主機發送資料 remote_socket.send(local_buffer) print("[==>]Sent to remote.") #接受響應的資料 remote_buffer=receive_from(remote_socket) if len (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 not len (remote_buffer): client_socket.close() remote_socket.close() print("[*] No more data.Closing connection.") break def hexdump(src,length=16): result=[] digits =4 if isinstance(src,unicode) else 2 for i in xrange(0,len(src),length): s=src[i:i+length] hexa=b''.join(["%0*X"%(digits,ord(x)) for x in s]) text=b''.join([x if 0x20<=ord(x)<0x7F else b'.' for x in s]) result.append(b"%04x %-*s" %(i,length*(digits+1),hexa,text)) print(b'\n',join(result)) def receive_from(connection): buffer="" connection.settimeout(2) try: while True: data=connection.recv(4096) if not data: break buffer +=data except: pass return buffer def request_handler(buffer): #執行包修改 return buffer def response_handler(buffer): return buffer