一千萬個為什麽

搜索

為什麽socket.makefile對象在第一次讀取UDP套接字後失敗?


我正在使用 socket.makefile 方法創建一個UDP套接字上的類文件對象,用於讀取。當我收到UDP數據包時,我可以使用read方法一次性讀取數據包的全部內容,但如果我嘗試將其分成多個讀取,我的程序會掛起。

這是一個演示此問題的程序:

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 對象的這個問題。

為什麽會發生這種情況,我該怎麽做才能阻止它呢?

最佳答案

你正在發送1個數據包,但是調用了兩次。 2. read不會讀取任何內容,因為沒有新的數據包可供讀取/接收。在udp套接字上讀取如果沒有讀取所有字節,則讀取一個數據包並丟棄其余數據。 UDP不是面向流的,而是面向消息/數據報。

UDP不映射到文件的概念。 “文件”只是一個字節流,而不是數據包的集合,它有一個結束。這很像TCP,你從它讀取字節 - 你用來讀取數據的讀數並不重要,你可以檢測到它的結束。

轉載註明原文: 為什麽socket.makefile對象在第一次讀取UDP套接字後失敗?

猜你喜歡