2012-07-16 161 views
0

我在接收UDP數據包時遇到了問題。我的環境在ARMv7上運行Android 2.1。使用C socket編程,我使用recvmsg從內核接收數據包,但偶爾會發生一些數據包丟失事件。發送者和接收者在同一個局域網中,所以毫無疑問,數據包不應該丟失。我通過Wireshark進行了證明。C socket recvmsg,數據包丟失

然而,當我更換recvmsgrecvfrom的接收數據包,並不再出現丟包事件。

我敢肯定recvmsg的返回值始終是大於0,意味着沒有錯誤發生。

是否有可能某些數據包僅在使用時丟失在內核空間中recvmsg

+0

是否所有數據包都從同一個源發送?也許多個來源發送數據包到你的一個套接字? – zmbq 2012-07-16 10:49:35

+0

recvfrom有什麼問題? – mathk 2012-07-16 12:29:43

+0

是的,所有數據包都從同一個源發送。 – Corey 2012-07-19 00:48:38

回答

2

是的,這是可能的。 UDP是不可靠的。如果丟棄UDP數據報會產生問題,那麼你的設計就會出錯。

+0

數據包不會丟在網絡上,正如他用Wireshark所證明的,所以他不應該看到丟失的數據包。丟失的數據包會導致設計良好的系統出現性能問題,因此您希望儘量減少它們,特別是如果您是原因的話。 – zmbq 2012-07-16 10:48:59

+1

他沒有看到丟失的數據包,他看到丟失的數據報。 UDP數據報可能會丟失,這只是UDP的性質。在網絡上丟失數據包只是數據報可能丟失的一種方式。當然,如果你是原因,你應該做一些事情。但不管你做什麼,UDP數據報丟失總是可能的。這只是UDP的本質。 – 2012-07-16 10:50:50

+0

當數據包丟失在系統中時,這是不正常的。這是可能的,而是因爲壓力條件。 – 2012-07-16 12:49:34

0

通過cat/proc/net/udp檢查您的套接字是否丟棄。

+0

我稍後再檢查一次。非常感謝。 – Corey 2012-07-22 14:32:12

-1

recv man page似乎表明recvmsg不會阻止,而recvfrom的確實阻止,至少在默認情況下。您可能正在呼叫recvmsg,此時沒有可用的數據包。如果你反覆調用它,我想你最終可能會看到你所有的數據包,就像你在wireshark中做的那樣。

+0

這根本不是它'似乎表明'的東西。它實際上說*是這樣的:'如果沒有消息在套接字上可用並且O_NONBLOCK沒有在套接字的文件描述符上設置,那麼'recvfrom()'阻塞直到消息到達。如果在套接字中沒有消息可用,並且在套接字的文件描述符上設置了O_NONBLOCK,則recvfrom()函數將失敗並將errno設置爲[EAGAIN]或[EWOULDBLOCK]。 – EJP 2015-05-11 05:30:12