簡體   English   中英

從UDP套接字讀取所有數據

[英]Reading all the data from a UDP socket

情況:

我有一個綁定到localhost UDP端口33100的sendersocket。我有一個綁定到localhost UDP端口33101的receiverocket套接字。

發送方套接字發送4500字節的數據(字符串“hello man”* 500)。 在接收方,我有一個epoll對象,它等待receiverocket上的EPOLLIN事件。 當有活動時,我會這樣做:

while True:
    msg_received = receiver_socket.recv(128)
    if msg_received.decode("UTF-8") == "":
        break
    else:
        print msg_received.decode("UTF-8")

問題:

主要的問題是,在讀完前128個字節的數據后,我再也看不懂了。 發送方表示它按預期發送了4500字節的數據。

如果發送方再次發送相同的4500字節數據,則再次注冊EPOLLIN事件並讀取新字符串。 不知何故,在我第一次閱讀后,緩沖區被清除了。

現在,即使發送者剛剛發給我的4500個字節的數據,第一recv給了我128個字節的數據,然后什么都不是recv版之后。

我可能正在做一些非常愚蠢的事情所以請賜教。 我想收到所有4500字節的數據。

如果您還不知道數據包的大小,則應始終使用65535 (UDP數據包的最大大小)調用recv。 否則,當您調用recv ,整個數據包將被標記為已讀並從緩沖區中清除,但只有前128個字節被送入msg_received

編輯 :當您(如果)轉換為僅通過網絡接收數據時,您可以使用較小的數字進行recv ,如文檔中所述

如果你知道你將獲得4500字節的數據,你可以調用receiver_socket.recv(4500)

您的代碼所說的是使用receiver_socket.recv(128)讀取的最大字節數為receiver_socket.recv(128)

有關套接字,請參閱python文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM