文件通过UDP套接字发送

时间:2012-10-06 13:40:49

标签: python

我使用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()

感谢。

1 个答案:

答案 0 :(得分:5)

由于UDP是无连接的,因此接收方无法直接了解发送方何时完成。

你可以解决这个问题,例如,当发送者完成时发送一个特殊的数据包,表明不再有数据包。

但是,我强烈建议你不要这样做; UDP不保证数据包的传送 - 数据包可能会丢失,重复或无序传送。很明显,对于大多数文件来说,如果他们丢失了一个部件,或者重新排序等等,这将是不可接受的。如果你想在主机之间传输文件,我认为你使用TCP会好得多。

相关问题