0

我有一个客户端应用程序使用winsock 的sendto()方法通过UDP 将数据发送到服务器应用程序。在我的客户端应用程序上,我制作了 5 quick sendto()。在我的服务器应用程序上,我等待 10 秒,然后执行select()and recvfrom()。会给我recvfrom()客户端发送的第一个数据包还是任意一个(无论哪个先到达)?我仍然能够获得其他 4 个数据包,还是 winsock 的 UDP 框架只缓冲一个?

4

3 回答 3

2

recvfrom() 会给我客户端发送的第一个数据包还是任意一个

由于 UDP 不处理重新排序,因此您可以获得任何消息。您收到的消息可能少于 4 条,甚至更多(但今天很少见)。

于 2012-04-10T18:30:26.077 回答
1

使用 5 个大小合理的数据包,您可能会收到所有数据包,并且您可能会先发送第一个数据包。但是它们可能出现故障,可能无法到达,并且如果它们确实到达,则可能不包含原始数据。您必须使用 UDP 自己处理所有这些。(但根据您的应用程序和要求以及网络的稳定性,这可能不是一个真正的问题;在某些情况下接收 99% 的数据是完全可以的,这当然是可能的)。

于 2012-04-10T18:32:17.850 回答
1

UDP 不保证接收到的数据包的顺序,所以基本上,第一个数据包recvfrom() 可能是您发送的第一个数据包,但不能是 - 这就是 TCP 的用途(它保证接收数据的顺序)。如果数据包在传输过程中丢失,您可能根本不会收到部分数据包(或任何数据包)。

对于第二部分:通常,操作系统会为您缓冲一定数量的数据包,这取决于为 UDP 套接字设置的套接字缓冲区 - 缓冲区特定于每个套接字,而不是在它们之间共享。在 Windows 上,我不确定如何获取缓冲区的大小,在 Linux 上,请查看“/proc/sys/net/ipv4/udp_mem”;通常,您可以轻松地在其中放置五个 UDP 数据包。

于 2012-04-10T18:33:02.523 回答