2012-07-06 112 views
1

我正在调用一个有效地址的recvfrom api,在那里我试图读取大小为9600字节的数据,缓冲区我提供了我的大小12KB,我甚至没有选择阅读事件。 即使严格推荐的MTU大小是1.5 KB,我可以发送和接收4 KB的数据包。套接字UDP recvfrom不适用于大数据包,即使缓冲区给定足够在LINUX上

我正在使用android NDK(Linux)进行开发。

请帮忙。有没有一个套接字选项,我必须设置为读取大型缓冲区?

回答

0

如果发送的数据包比MTU大,它将是fragmented。也就是说,它会被分成更小的部分,每个部分都适合MTU。问题是,如果即使其中一个丢失(很可能在蜂窝连接上...),整个数据包也将消失。

要确定是否属于这种情况,您需要在连接的一端(或两端)使用数据包嗅探器。 Wireshark是PC端的好选择,或者android端的tcpdump(你需要root)。请记住,家庭路由器可能会重新组合碎片数据包 - 这意味着如果您正在从家庭路由器/防火墙内嗅探数据包,您可能看不到任何碎片到达,直到它们全部到达路由器(并且显然如果有一些碎片失去这个不会发生)。

更好的选择是简单地确保始终发送小于MTU的数据包。碎片几乎不是正确的做法。请记住,服务器和客户端之间的路径MTU可能会有所不同 - 您可以使用少于1500的常见选项(1400应该是安全的),或者尝试通过setting the MTU discovery flag on your UDP packets(通过IP_MTU_DISCOVER)并始终发送小于getsockoptIP_MTU选项返回的值(包括重发!)

+0

感谢您的回复。我将检查套接字选项 – FunnyName 2012-07-10 04:00:03