1

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()

ありがとう。

4

1 に答える 1

5

UDPはコネクションレス型であるため、受信側が送信者がいつ完了したかを知るための簡単な方法はありません。

これを回避するには、たとえば、送信者が完了したときに、これ以上パケットが続かないことを示す特別なパケットを送信します。

ただし、それに対して強くお勧めします。UDPは、パケットの配信について保証しません---パケットが紛失、複製、または順序が狂って配信される可能性があります。明らかに、ほとんどのファイルでは、一部が欠落している場合や、並べ替えられている場合などは受け入れられません。ホスト間でファイルを転送する場合は、TCPを使用する方がはるかに良いと思います。

于 2012-10-06T14:05:27.460 に答える