Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python套接字发送、接收_Python_Sockets_Network Programming_File Transfer - Fatal编程技术网

使用python套接字发送、接收

使用python套接字发送、接收,python,sockets,network-programming,file-transfer,Python,Sockets,Network Programming,File Transfer,我目前正在尝试编写一个进程,该进程将n个IP序列嵌入到数据包中,并将其发送到n个服务器。每个服务器删除最外层的IP,然后将其转发到所述IP。这和我知道的隧道一样。在此过程中,我还希望服务器执行跟踪路由,将数据包转发到它要转发的位置,并将其发送回上一个服务器 我的代码目前将转发数据包,但在执行跟踪路由并获取数据包时遇到了问题。我相信它目前被困在中间服务器的while循环中。我想这与我没有正确关闭插座有关。有什么建议吗 客户 目标服务器 在这个循环中,中间服务器被困在clisock.recv()中,

我目前正在尝试编写一个进程,该进程将n个IP序列嵌入到数据包中,并将其发送到n个服务器。每个服务器删除最外层的IP,然后将其转发到所述IP。这和我知道的隧道一样。在此过程中,我还希望服务器执行跟踪路由,将数据包转发到它要转发的位置,并将其发送回上一个服务器

我的代码目前将转发数据包,但在执行跟踪路由并获取数据包时遇到了问题。我相信它目前被困在中间服务器的while循环中。我想这与我没有正确关闭插座有关。有什么建议吗

客户 目标服务器
在这个循环中,中间服务器被困在
clisock.recv()
中,因为在客户端关闭连接之前,中断条件
not raw
没有得到满足,并且客户端在从中间服务器接收跟踪路由之前没有关闭连接,所以它们正在互相等待。 为了补救这一点,您可以考虑将文件大小发送到中间服务器,以便它可以用来确定接收循环何时完成。或者,如果您的平台支持关闭一半连接,则可以使用

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

#!/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()
s.shutdown(socket.SHUT_WR)