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