C ++ winsock recvfrom()和sendto()

时间:2012-04-10 18:28:32

标签: c++ udp winsock

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

3 个答案:

答案 0 :(得分:2)

  

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

UDP不保证收到的数据包排序,所以基本上,你recvfrom() 的第一个数据包可能是你发送的第一个数据包,但一定不能 - 这就是TCP是什么for(保证接收数据的排序)。如果它们在传输过程中丢失,您可能根本没有收到部分数据包(或任何相关的数据包)。

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