我正在使用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
對象的這個問題。
爲什麼會發生這種情況,我能做些什麼來阻止它?