如果数据发送到客户端,但客户端忙于执行其他操作,使用recvfrom()可读取数据多长时间?
另外,如果在读取第一个数据包之前发送第二个数据包,会发生什么情况?是第一个数据包丢失了,下一个数据包坐在那里读取?
(windows – udp)
在c中实现gets()
使用RPATH而不是RUNPATH?
信号处理程序中设置标志
防止在C(不是C ++)中使用MinGW进行名称修改以进行dynamic符号search
使用另一种forms的方法中的值
如何使用ld创build共享库?
属性表(MFC)的RTL布局问题
Visual Studio 2012升级后出现“Module was built without symbols”错误
通常情况下,数据将被缓冲直到被读取。 我想如果你等待足够长的时间,驱动程序完全耗尽空间,那么它将不得不做一些事情 ,但是假设你的代码在中途合理运行,这应该不成问题。
一个典型的网络驱动程序将能够缓冲大量的数据包而不会丢失任何数据包。
如果数据发送到客户端,但客户端忙于执行其他操作,使用recvfrom()可读取数据多长时间?
永远,或根本没有 ,或者直到你关闭套接字或读取多达一个字节。
原因是:
UDP传递数据报,或者不传递数据报 。 这听起来像是无稽之谈,但事实正是如此。
一个单独的UDP数据报与一个或几个“片段”相关,这些片段是IP数据包(进一步封装在“有线”协议中的一些“无关紧要”)。 网络堆栈收集数据报的所有片段。 如果任何一个片段的校验和不好,或者其他任何使网络堆栈不愉快的事情, 那么完整的数据报将被丢弃 ,而且你会注意到,甚至没有错误。 你根本不知道发生了什么事。
如果一切顺利的话,一个完整的数据报被放入接收缓冲区。 永远不要少,永远不要。 如果你以后试图恢复,那就是你会得到的。
接收缓冲区显然必须足够大以容纳至少一个最大大小的数据报(65535字节),但由于通常数据报不会是最大大小,而是低于1280字节(或1500,如果你愿意),它通常可以保持其中很多(在大多数平台上,缓冲区默认约128-256k左右,并且是可配置的)。
如果缓冲区中没有足够的空间,则丢弃数据报,并且什么也没有 (那么你仍然可以得到已经在缓冲区中的那个)。 再次,你甚至不知道发生了什么事情。
每次调用recvfrom ,都会从缓冲区中删除一个完整的数据报 (重要的细节!),并且您可以获得您请求的字节数。 这意味着如果你天真地尝试读几个字节,然后再读几个字节,它就不会工作。 第一次读取将丢弃数据报的其余部分,随后读取一些未来数据报的第一个字节(也可能是块)。
这与TCP的工作方式有很大不同 。 在这里你可以再次读取几个字节和几个字节,而且它只会工作,因为网络层模拟一个数据流 。 你给了一个垃圾它如何工作,因为网络堆栈确保它的工作。
另外,如果在读取第一个数据包之前发送第二个数据包,会发生什么情况?是第一个丢失数据包,还是下一个数据包坐在那里读取?
你可能打算说“收到”而不是“发送”。 发送和接收有不同的缓冲区,所以根本不重要。 关于还在缓冲区中的另一个数据包,请参阅上面的说明。 如果缓冲区可以容纳第二个数据报,它将会存储它,否则它会默默地去* poof *。
这不会影响已经在缓冲区中的任何数据报。
如果数据发送到客户端,但客户端忙于执行其他操作,使用recvfrom()可读取数据多长时间?
这取决于操作系统,在Windows中,我相信默认的每个UDP套接字是8012,这可以用setsockopt() Winsock文档引发所以,只要缓冲区不满,数据就会一直留在那里,直到套接字被关闭或被读取。
另外,如果在读取第一个数据包之前发送第二个数据包,会发生什么情况?是第一个丢失数据包,还是下一个数据包坐在那里读取?
如果缓冲区有空间,则它们都被存储,如果没有,则丢弃其中的一个。 我相信它是最新的,但我不是100%肯定的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。