我使用python'UDP套接字发送文件。在接收方(file_receiver.py),您需要中断(ctrl-c)程序以便在最后接收文件。因此,我将settimeout设置为2秒,以便在完全接收数据后自动退出程序。如果我知道,你不能在UDP中设置非阻塞套接字。什么是克服这个问题的最佳方法。
file_sender.py
#!/usr/bin/env python
from socket import *
import sys
s = socket(AF_INET,SOCK_DGRAM)
host ="localhost"
port = 9999
buf =1024
addr = (host,port)
f=open (sys.argv[1], "rb")
data = f.read(buf)
while (data):
if(s.sendto(data,addr)):
print "sending ..."
data = f.read(buf)
s.close()
f.close()
file_receiver.py
#!/usr/bin/env python
from socket import *
import sys
import select
host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))
addr = (host,port)
buf=1024
f = open("op.pdf",'wb')
data,addr = s.recvfrom(buf)
while(data):
f.write(data)
s.settimeout(2)
data,addr = s.recvfrom(buf)
f.close()
s.close()
感谢。
答案 0 :(得分:5)
由于UDP是无连接的,因此接收方无法直接了解发送方何时完成。
你可以解决这个问题,例如,当发送者完成时发送一个特殊的数据包,表明不再有数据包。
但是,我强烈建议你不要这样做; UDP不保证数据包的传送 - 数据包可能会丢失,重复或无序传送。很明显,对于大多数文件来说,如果他们丢失了一个部件,或者重新排序等等,这将是不可接受的。如果你想在主机之间传输文件,我认为你使用TCP会好得多。