2012-04-10 215 views
0

我有一個客戶端應用程序,使用winsock的sendto()方法向UDP發送數據到服務器應用程序。在我的客戶端應用程序上,比如說5快速sendto()。在我的服務器應用程序中,我等待10秒,然後執行select()recvfrom()recvfrom()會給我客戶端發送的第一個數據包,還是將它作爲任意數據包(無論哪個首先到達)?我仍然能夠獲得其他4個數據包,或者winsock的UDP框架只緩衝一個嗎?C++ winsock recvfrom()和sendto()

回答

1

UDP不保證數據包的接收順序,所以基本上,第一個包,你recvfrom()可能是你發出的第一個包,但決不能 - 這就是TCP是(這保證了接收數據的排序)。如果他們在運輸途中丟失,你可能根本沒有收到部分數據包(或者任何數據包)。對於第二部分:通常,操作系統會爲您緩衝一定數量的數據包,這取決於爲UDP套接字設置的套接字緩衝區 - 緩衝區是特定於每個套接字的,並且不在它們之間共享。在Windows上,我不確定如何在Linux上獲取緩衝區的大小,請查看「/ proc/sys/net/ipv4/udp_mem」;一般來說,您可以輕鬆地在其中安裝五個UDP數據包。

+0

即使只發送一次,recvfrom()是否可以返回兩次相同的數據包? – 2012-04-10 18:57:18

+1

是的,數據包重複可能在傳輸過程中發生。使用UDP,所有投注都將關閉。可靠性。 – modelnine 2012-04-10 18:59:26

2

請問recvfrom的()給我通過客戶端發送的第一個數據包或 會是一個任意

由於UDP不處理重新排序,你可以得到任何消息。你可以得到少於4條消息甚至更多(但是今天很少見)。

1

合理尺寸的5個數據包,你會可能得到的所有數據包,你會可能拿到第一個先發。但它們可能無序,可能不會到達,並且如果它們到達,可能不包含原始數據。你必須用UDP來處理所有這些。 (但是,根據您的應用程序和要求以及網絡的穩定性,這可能不是一個真正的問題;在某些情況下,99%的數據完全可以接受)。

+0

雖然UDP很可能至少數據是正確的,因爲UDP有一些基本的校驗和內置。 – 2012-04-10 18:33:02

+0

如果源主機啓用了UDP校驗和 - 主機可能選擇不在發送端使用UDP校驗和。 – modelnine 2012-04-10 18:33:40