C socket recvmsg,数据包丢失

时间:2012-07-16 10:10:10

标签: android c linux sockets

我遇到接收UDP数据包的问题。我的环境在ARMv7上运行Android 2.1。使用C套接字编程,我使用 recvmsg 来接收来自内核的数据包,但偶尔会有一些数据包丢失事件。发送方和接收方位于同一个LAN中,因此毫无疑问数据包不会丢失。我通过 Wireshark 证明了这一点。

但是,在我用 recvfromg 替换 recvmsg 来接收数据包之后,没有发生数据包丢失事件了。

我确定 recvmsg 的返回值始终大于0,表示不会发生错误。

仅在使用 recvmsg 时,是否有可能在内核空间中丢弃某些数据包?

3 个答案:

答案 0 :(得分:2)

是的,这是可能的。 UDP是不可靠的。如果删除UDP数据报会产生问题,那么您的设计就会出现问题。

答案 1 :(得分:0)

通过cat / proc / net / udp检查插座是否有掉落。

答案 2 :(得分:-1)

recv man page似乎表示 recvmsg不会阻止,而 recvfrom会阻止,至少默认情况下如此。您可能正在调用recvmsg,此时没有可用的数据包。如果你反复调用它,我想你最终可能会看到你所有的数据包就像你在wireshark中所做的一样。