1. 程式人生 > >用Python 寫一個TCP 伺服器和TCP代理

用Python 寫一個TCP 伺服器和TCP代理

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