日期:2014-05-16  浏览次数:20708 次

关于recvfrom函数的一些问题
我想问一下recvfrom它接收数据包是从系统中的缓冲区接收数据的么?还有就是在两个数据包发送的间隔非常小的时候会有丢包的现象么,,,,我今天在写一段有关recvfrom的程序时发现用wireshark能够抓到两个间隔时间很小的数据包,但是我的recvfrom函数去只能接收到后面的一个,,不知道这是什么个情况

------解决方案--------------------
不会出现覆盖掉的,,,
只要发送的UDP报文没在网络上丢失,且目标计算机对于此端口的UDP socket缓冲空间足够。则此UDP报文就安全到达了;否则,报文丢失。安全到达了的报文,就可以用recvfrom随时的从系统缓冲中一个个取出来了。
探讨

recvfrom应该是udp的控制协议,udp是不提供流量控制的,也就是说,如果在短时间内发送大量的数据,那么缓冲区中来不及取的数据就会被覆盖掉,所以如果使用udp并且想提高稳定性,应该自己加一些控制措施

------解决方案--------------------
udp接收可以用recvfrom或者recvmsg(一般情况)
recvfrom可用于接收tcp(addr设置为NULL)和udp.
recvfrom只是从系统的socket缓冲中取数据(并没有实际操作网卡接收数据)。recvfrom取数据和“系统实际操作网卡接收数据、数据链路层处理、网络层处理、传输层处理、放到系统缓存中(空间足够否?)”,这两个过程是异步的。
了解每? recvfrom函数和包间隔无关。

你的这个问题,我不清楚具体情况。包间隔短只收到后一个的例子好像不充分,,你看看是否每此包间隔时间段的都只能收到后一个. 我想是不可能的。。 wireshark抓到的包都已经在系统的数据链层处理了,除非接收缓存已经满了,否则是不可能丢失的。被覆盖的说法更不可能。
探讨

引用:

recvfrom应该是udp的控制协议,udp是不提供流量控制的,也就是说,如果在短时间内发送大量的数据,那么缓冲区中来不及取的数据就会被覆盖掉,所以如果使用udp并且想提高稳定性,应该自己加一些控制措施

recvfrom是专门针对udp的么,,,用它不能接收数据链路层的数据么,。。。这个应该是看函数参数中的套接字申明的类型的吧,,,最主要的是我这个丢包是一……