2010-01-28 106 views
2

假設Linux和使用UDP。上recvfrom的混亂()在應用程序級協議設計

recvfrom的的manpage說:

的接聽電話通常返回可用任何數據,直到請求的數量,而不是等待接收請求的全額。

如果是這種情況,那麼它是非常可能從插座返回部分應用程序級協議數據,即使期望MAX_SIZE被設置。

recvfrom的後續調用進行?

在另一種意義上,它也可能有比我想要的數據,在插座的緩衝比如兩個UDP包多。如果recvfrom()被稱爲在這種情況下,它會返回他們兩個(內MAX_SIZE假設)?

我想應該有一些應用協議級別的大小信息在每個UDP消息的開始,以便它不會搞砸。

回答

1

Well..I得到一個更好的答案在網上搜索後:

不要害怕使用一個大的緩衝區,並指定讀取時,大數據報大小的... recv()只讀ONE報即使有很多人在接收緩衝區,他們都適合你的緩衝......記住,UDP是面向數據報,所有的操作都在這些數據包,而不是字節...

一如果您使用TCP套接字,將會面臨不同的情況.... TCP沒有任何邊界「概念」,所以你就像你想讀的字節數和recv()將返回的字節數等於MIN(bytes_in_buffer, bytes_solicited_by_your_call)

REF:http://www.developerweb.net/forum/archive/index.php/t-3396.html

1

我想你想的手冊頁this one。它聲明額外的數據將被丟棄。如果有兩個數據包,recvfrom調用將只從第一個數據中檢索數據。

+0

那麼關於後續recvfrom的( )電話?它會得到第一個已存在於第一個緩衝區中的第二個緩衝區嗎? – Figo 2010-01-28 03:49:51

+0

@Figo:是的,它一次只返回一個。 – 2010-01-28 04:08:14