1

我正在使用 python 的 UDP 套接字发送文件。在接收方(file_receiver.py),您需要中断(ctrl-c)程序才能在最后接收文件。因此,我将 settimeout 设置为 2 秒,以便程序在完全接收到数据后自动退出。如果我知道的话,你不能在 UDP 中设置非阻塞套接字。克服这个问题的最佳方法是什么。

文件发件人.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()

文件接收器.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()

谢谢。

4

1 回答 1

5

因为 UDP 是无连接的,所以接收方没有直接的方法可以知道发送方何时完成。

您可以解决此问题,例如,通过在发送者完成后发送一个特殊的数据包,表明不会有更多的数据包跟随。

但是,我强烈建议您不要这样做;UDP 不保证数据包的传递——数据包可能会丢失、重复或乱序传递。显然,对于大多数文件,如果它们丢失了一部分,或者重新排序等是不可接受的。如果你想在主机之间传输文件,我认为你最好使用 TCP。

于 2012-10-06T14:05:27.460 回答