2012-09-13 27 views
3

考慮通過套接字發送的100個字節。對於TCP套接字,如果我調用recv()長度爲50,我會得到前50個字節,如果我再次調用它,我會得到第二個50字節。使用UDP套接字,如果我調用長度爲50的recvfrom(),我會得到前50個字節,但是無法檢索第二個50 - 隨後調用recvfrom()塊,直到收到下一個數據報。接收整個UDP數據報,不管大小如何?

這是否意味着,如果我想接收一個完整的UDP數據報,無論大小,我必須分配一個64k緩衝區(UDP允許的最大值)?如果我connect()我的UDP套接字,這是否改變了行爲?或者,一個在UDP上運行的協議通常需要一個已知的應該用於緩衝區的最大數據包大小?

回答

2

大多數基於UDP的協議不會通過MTU減去IP和UDP頭來避免IP fragmentation。例如。對於大於512字節的消息,DNS切換到TCP。因此,除非您的網絡使用巨型幀,否則您可能安全使用1472字節的緩衝區(1500以太網MTU - 20用於沒有選項的IP標頭 - 8 UDP標頭)。這當然取決於UDP之上的應用協議。

如果您確實是偏執狂(或使用未知協議),您可以使用MSG_PEEKMSG_TRUNC標誌首先計算出大小,然後分配足夠大的緩衝區(請參閱recv(2))。