簡體   English   中英

使用python套接字發送,接收

[英]Sending, receiving with python socket

我目前正在嘗試編寫將n個IP序列嵌入到數據包中並將其發送給n個服務器的過程。 每個服務器刪除最外面的IP,然后將其轉發到所述IP。 這就像我所知道的隧道。 在此過程中,我還希望服務器對它轉發數據包的位置進行跟蹤路由,然后將其發送回先前的服務器。

我的代碼當前將轉發數據包,但它停留在執行traceroute並獲取它上。 我相信它目前停留在中間服務器的while循環中。 我認為這與我無法正確關閉插座有關。 有什么建議嗎?

客戶

#!/usr/bin/env python

import socket               # Import socket module
import sys
import os


s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 17353                # Reserve a port
FILE = raw_input("Enter filename: \n ")         
NIP = raw_input("Enter Number of IPs: ")
accepted_IP = 0
IP= []
while accepted_IP < int(NIP):
    IP.append(raw_input("Enter destination IP: \n"))
    accepted_IP +=1
#cIP = raw_input("Enter intemediate IP: \n ")       
ipv = raw_input("Enter IP version... 4/6")
try:
    s.connect((host, port))
    print "Connection sucessful!"
except socket.error as err:
    print "Connection failed. Error: %s" %err
    quit()

raw = open(FILE,"rb")
size = os.stat(FILE).st_size
ls = ""
buf = 0
for i in IP:
    while len(i) < 15:
        i += "$"
    ls += i
header = ipv+NIP+ls+FILE
print ls

s.sendall(header + "\n")
print "Sent header"

data = raw.read(56) +ipv + NIP + ls 
print "Begin sending file"
while buf <= size:
    s.send(data)
    print data
    buf += 56
    data = raw.read(56) + ipv + NIP + ls
raw.close()


print "Begin receiving traceroute"
with open("trace_log.txt","w") as tracert:
    trace = s.recv(1024)
    while trace:
        treacert.write(trace)
        if not trace: break
        trace = s.recv(1024)

print "finished forwarding"

s.close()

中間服務器

#!/usr/bin/env python

import socket
import subprocess 

srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
srvsock.bind( (socket.gethostname(), 17353) ) 
srvsock.listen( 5 ) # Begin listening with backlog of 5


# Run server
while True:
    clisock, (remhost, remport) = srvsock.accept() #Accept connection
    print 
    d = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    header = ""
    while True:
        b = clisock.recv(1)
        if b == "\n":
            break
        header += b

    num = 15 * int(header[1]) + 2
    file_name = header[num:]
    nheader = header[0]+ str(int(header[1])-1) + header[17:]
    d.connect((socket.gethostname(), 12355))
    d.sendall(nheader+'\n')
    print "begin forwarding"
    while True:
        raw = clisock.recv(56 + num) # recieve data
        ip = raw[-15:] # extract IP
        ipv, NIP = raw[57] , str(int(raw[57])-1)
        if NIP == "0":
            while (raw):
                print "stuck in this loop"
                d.send(raw[:56])
                raw=clisock.recv(56+num)
                if not raw: break
        else:
            while (raw):
                print raw[:57] + NIP + raw[59:-15] 
                print "\n"
                d.send(raw[:57] + NIP + raw[59:-15])
                raw = clisock.recv(56+num)
                if not raw :break
        print "Finish forwarding"
        d.close()
        break
    print "Begin traceroute"
    tracrt = subprocess.Popen(['traceroute','google.com'], stdout=subprocess.PIPE)
    s.sendall(tracrt.communicate()[0])
    print "Finished"
    clisock.close()
s.close()

目標服務器

import socket


s = socket.socket()
host = socket.gethostname()
port = 12355
s.bind((host,port))

s.listen(5)

while True:
    csock, (client, cport) = s.accept()
    print client
    header = ""
    while True:
        b = csock.recv(1)
        if b == "\n":
            break
        header += b
    file_name = header[2:]
    r = open("File_test_"+file_name,"wb")
    print 'Opening file for writing'
    while True:
        print "Begin writing file" + " " + file_name
        raw = csock.recv(56)
        while (raw):
            print raw
            r.write(raw)
            raw = csock.recv(56)
        r.flush()
        r.close()
        print "finish writing"
        break

    print "closing connection"
    csock.close()
s.close()

中間服務器在此循環中被卡在clisock.recv()中,因為在客戶端關閉連接之前未滿足not raw中斷條件,並且客戶端在從中間服務器接收traceroute之前沒有關閉連接,所以他們正在互相等待。 為了解決這個問題,您可以考慮將文件大小發送到中間服務器,以便可以使用它確定何時完成接收循環。 或者,如果您的平台支持關閉一半的連接,則可以使用

s.shutdown(socket.SHUT_WR)

在客戶端發送文件后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM