C++ winsock recvfrom() and sendto()



我有一个客户端应用程序,使用 winsock 的 sendto() 方法将数据发送到具有 UDP 的服务器应用程序。在我的客户端应用程序上,我做了,比如说,5个快速sendto()。在我的服务器应用程序上,我等待,比如说,10秒,然后做一个select()recvfrom()recvfrom()会给我客户端发送的第一个数据包还是任意数据包(以先到达者为准)?我是否仍然能够获得其他 4 个数据包,或者 winsock 的 UDP 框架只缓冲一个?

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

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

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

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

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

最新更新