2010-04-17 51 views
2

我正在使用socket.makefile方法在UDP套接字上創建一個類文件對象用於讀取。當我收到一個UDP數據包時,我可以通過使用read方法一次讀取數據包的全部內容,但是如果我嘗試將它分成多個讀取,我的程序就會掛起。爲什麼在首次讀取UDP套接字後,socket.makefile對象失敗?

這裏有一個程序,它演示了此問題:

import socket 
from sys import argv 

SERVER_ADDR = ("localhost", 12345) 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(SERVER_ADDR) 
f = sock.makefile("rb") 

sock.sendto("HelloWorld", SERVER_ADDR) 

if "--all" in argv: 
    print f.read(10) 
else: 
    print f.read(5) 
    print f.read(5) 

如果我與--all選項運行上面的程序,那麼它完美的作品和版畫HelloWorld。如果我沒有這個選項運行它,它會打印Hello,然後在第二次讀取時掛起。使用TCP套接字時,我沒有socket.makefile對象的這個問題。

爲什麼會發生這種情況,我能做些什麼來阻止它?

回答

2

您正在發送1個數據包,但呼叫讀取兩次。 2.讀取不會讀取任何內容,因爲沒有新的數據包要讀取/接收。如果您沒有讀取所有字節,則在udp套接字上讀取讀取一個數據包並丟棄其餘數據。 UDP不是面向流的,它是面向消息/數據報的。

UDP不映射到文件的概念。一個「文件」只是一個字節流,而不是數據包的集合,並且它有一個結束。這很像TCP,你可以從中讀取字節 - 無論你用多少次讀取數據讀取數據,都可以檢測到它的結束。

相關問題