2012-04-10 224 views
0

我有一个客户端应用程序,使用winsock的sendto()方法向UDP发送数据到服务器应用程序。在我的客户端应用程序上,比如说5快速sendto()。在我的服务器应用程序中,我等待10秒,然后执行select()recvfrom()recvfrom()会给我客户端发送的第一个数据包,还是将它作为任意数据包(无论哪个首先到达)?我仍然能够获得其他4个数据包,或者winsock的UDP框架只缓冲一个吗?C++ winsock recvfrom()和sendto()

回答

1

UDP不保证数据包的接收顺序,所以基本上,第一个包,你recvfrom()可能是你发出的第一个包,但决不能 - 这就是TCP是(这保证了接收数据的排序)。如果他们在运输途中丢失,你可能根本没有收到部分数据包(或者任何数据包)。对于第二部分:通常,操作系统会为您缓冲一定数量的数据包,这取决于为UDP套接字设置的套接字缓冲区 - 缓冲区是特定于每个套接字的,并且不在它们之间共享。在Windows上,我不确定如何在Linux上获取缓冲区的大小,请查看“/ proc/sys/net/ipv4/udp_mem”;一般来说,您可以轻松地在其中安装五个UDP数据包。

+0

即使只发送一次,recvfrom()是否可以返回两次相同的数据包? – 2012-04-10 18:57:18

+1

是的,数据包重复可能在传输过程中发生。使用UDP,所有投注都将关闭。可靠性。 – modelnine 2012-04-10 18:59:26

2

请问recvfrom的()给我通过客户端发送的第一个数据包或 会是一个任意

由于UDP不处理重新排序,你可以得到任何消息。你可以得到少于4条消息甚至更多(但是今天很少见)。

1

合理尺寸的5个数据包,你会可能得到的所有数据包,你会可能拿到第一个先发。但它们可能无序,可能不会到达,并且如果它们到达,可能不包含原始数据。你必须用UDP来处理所有这些。 (但是,根据您的应用程序和要求以及网络的稳定性,这可能不是一个真正的问题;在某些情况下,99%的数据完全可以接受)。

+0

虽然UDP很可能至少数据是正确的,因为UDP有一些基本的校验和内置。 – 2012-04-10 18:33:02

+0

如果源主机启用了UDP校验和 - 主机可能选择不在发送端使用UDP校验和。 – modelnine 2012-04-10 18:33:40