[英]Are datagrams always received completely?
大多數數據報接收函數,如c的recv或read,javas DatagramPacket類或pythons SocketServer,都可以找出接收到的數據量。
C:
int amount = recv(sock, buf, n, MSG_WAITALL);
Java的:
int amount = datagramSocket.getLength();
蟒蛇:
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
amount = len (self.request[0])
這些可靠嗎? 或者是否可能只收到部分消息,例如數據包碎片或網絡延遲?
換句話說:當我通過udp發送一個可變長度的數據塊並在另一端接收它時,這些數量值是否恰好等於原始塊的大小?
編輯:
ninjalj提出了一個很好的觀點,我想在此處加入。 當接收功能被中斷時會發生什么,例如通過信號? 當兩個線程同時嘗試從同一個套接字接收時會發生什么?
UDP數據報不能部分傳遞¹; 它們按原樣交付或根本不交付。 所以,是的,您可以確定收到的數據報的發送方式與您在接收方端看到的完全相同。
編輯以合並Will的評論,這是最好的正確(即技術上):
¹它們可以在IP級別進行分段,但接收方的網絡堆棧將完全重新組合數據報並將其傳遞給發送時的監聽過程,或者不會確認已收到任何數據。
部分數據報僅允許使用UDP Lite 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.