2010-10-15 180 views
4

我使用相同的UDP套接字發送和接收數據。我想知道是否DGRAM套接字的數據包排隊已經存在,或者我們必須單獨處理它。C++ UDP套接字數據包排隊

如果用戶代碼必須處理排隊,它是如何完成的?我們是否有單獨的線程來爲套接字recvfrom並將數據包放入reciver_queue中,並將sendto從另一個sending_queue中發送出去?

一個示例代碼將是絕對可怕的。謝謝你的幫助。

+0

當我使用recvfrom時,如何找出udp數據包的接收器地址(http://stackoverflow.com/questions/3940612/c-dgram-socket-get-the-receiver-address)? – SkypeMeSM 2010-10-15 09:54:42

回答

8

有一個包隊列。但是,當數據包隊列被填滿時,UDP數據包開始被丟棄。當它們被丟棄時,它們會永遠丟失,所以請確保您繼續閱讀數據!

+5

+1:請注意,即使您讀取的速度夠快,也不能保證UDP幀到達(按照正確的順序或「完全」),以便爲數據丟失做好準備。 – ereOn 2010-10-15 09:35:38

1

正如Goz指出的那樣,有一個數據包隊列。實際上,在整個管道中的各個地方都有不止一個地方以應用程序結束。 NIC上通常有一些緩衝區,然後有一些由內核管理。內核緩衝區通常可以使用setsockopt()爲單個套接字調整大小。

正如Goz已經指出的那樣,UDP數據包可能在途中丟失,或者它們可能以不同的順序驅動。如果你需要可靠性和順序,並且如果你不能使用TCP,你將不得不實現某種協議,這種協議將提供UDP協議,例如UDP協議。 sliding window protocol

1

對於UDP,實際上只有接收套接字緩衝區。雖然有SO_SNDBUF套接字選項,但提供的值僅是數據報大小的上限。出站數據報或者全部給出,或者以分段(如果它大於MTU)給出,或者丟棄。硬件通常具有一些環形緩衝區,但這實際上與DMA有關,並且與用戶級應用程序無關。

在應用程序中最直接的數據包排隊技術是,circular buffer - 使其足夠大,正常使用,在重尖端期間丟失一些數據包。當然還有其他方法。