发送,接收python套接字

时间:2014-07-01 14:06:27

标签: python sockets network-programming file-transfer

我目前正在尝试编写将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()

1 个答案:

答案 0 :(得分:0)

中间服务器在此循环中卡在clisock.recv()中,因为在客户端关闭连接之前未满足中断条件not raw,并且客户端在接收之前未关闭连接来自中间服务器的traceroute,因此它们彼此等待。 要解决此问题,您可以考虑将文件大小发送到中间服务器,以便可以使用它来确定接收循环何时完成。或者,如果您的平台支持关闭连接的一半,则可以使用

s.shutdown(socket.SHUT_WR)
发送文件后在客户端