2012-11-20 72 views
1

我使用UDP套接字建立在C小應用程序,我現在用的是以下recvfrom函數:C UDP套接字,數據包在哪裏被存儲以供recvfrom檢索?

int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen); 

其實我從那裏數據被這個功能,因爲在我的應用程序檢索納悶,我收到不同數據包,一旦我確定我收到了所有的數據包,我使用一個循環來檢索幾個數據包。

它似乎工作(也許我很幸運;)但我真的不明白我的數據包存儲在哪裏之前,通過多次調用recvfrom在我的循環中檢索。

預先感謝您的幫助,祝您有美好的一天! Alex

回答

4

它們被保存在內核中的某些內部緩衝區中。如果緩衝區填滿了(即,如果你的應用程序停止調用recvfrom),內核將開始丟棄數據報。

重要的是要認識到sendtorecvfrom只是看起來像memcpy類似的調用 - 他們都沒有實際「發送」或「接收」任何東西。 Sendto將數據複製到內核,然後然後內核嘗試將其實際放入數據包中,依此類推。同樣,在您撥打recvfrom時,數據已被收到,recvfrom只有將其複製到您的用戶空間緩衝區

+0

非常感謝你這個明確的答案!我現在明白我在做什麼 –

0

所有收到的數據包都存儲在內核隊列中。這是一個固定長度的隊列。如果應用程序沒有收到數據包,它將覆蓋舊數據包。並更新其隊列。所以每當你從一個可用的舊數據包中收到receivefrom給你。

+0

完全不正確。它不是一個固定長度的隊列,它是一個可變大小的緩衝區,其大小可以由應用程序控制。如果緩衝區已滿,則後續數據報將被丟棄:它們不會被覆蓋。最後一句與之前的兩句相矛盾。 -1 – EJP