Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字UDP recvfrom不适用于大数据包,即使在LINUX上提供的缓冲区足够大_Linux_Sockets - Fatal编程技术网

套接字UDP recvfrom不适用于大数据包,即使在LINUX上提供的缓冲区足够大

套接字UDP recvfrom不适用于大数据包,即使在LINUX上提供的缓冲区足够大,linux,sockets,Linux,Sockets,我正在调用一个有效地址的RecvFromAPI,在这里我试图读取9600字节大小的数据,我提供的缓冲区大小为12KB,我甚至没有得到选择读取事件。 即使推荐的MTU大小是1.5 KB,我也能够发送和接收4 KB的数据包 我正在使用android NDK(Linux)进行开发 请帮忙。是否必须设置套接字选项才能读取大缓冲区?如果发送的数据包比MTU大,它将是。也就是说,它将被分成更小的部分,每个部分都适合MTU。这样做的问题是,即使其中一个片段丢失(很可能是在蜂窝连接上…),整个数据包也将有效地消

我正在调用一个有效地址的RecvFromAPI,在这里我试图读取9600字节大小的数据,我提供的缓冲区大小为12KB,我甚至没有得到选择读取事件。 即使推荐的MTU大小是1.5 KB,我也能够发送和接收4 KB的数据包

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


请帮忙。是否必须设置套接字选项才能读取大缓冲区?

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

要确定是否存在这种情况,您需要在连接的一端(或两端)使用数据包嗅探器。Wireshark是PC端的不错选择,或者是android端的tcpdump(您需要root)。请记住,家庭路由器可能会重新组装碎片数据包-这意味着,如果您在家庭路由器/防火墙内嗅探数据包,在所有碎片到达路由器之前,您可能看不到任何碎片到达(显然,如果一些碎片丢失,这不会发生)


当然,更好的选择是确保发送的数据包总是小于MTU。碎片化几乎从来都不是正确的做法。请记住,MTU可能在服务器和客户端之间的路径上以不同的跃点变化-您可以使用小于1500(1400应该是安全的)的常见选择,或者尝试通过(通过
IP\u MTU\u DISCOVER
)进行探测,并始终发送小于
getsockopt
IP\u MTU
选项返回的值(包括重新传输!)

感谢您的回复。我将检查套接字选项