我开发了一个udp服务器/客户端应用程序,其中服务器有一个套接字,它连续从40个客户端接收数据。 现在我想知道如果所有40个客户端一次发送数据会发生什么? 根据我的理解,数据必须在接收缓冲区中排队,下次当我调用recvfrom()时,接收到缓冲区中排队的数据,即我必须调用recvfrom()40次才能接收所有40个客户端的数据,即使所有客户端同时发送数据。 另外,我想知道40个客户端的所有数据都将在接收缓冲区中排队,或者某些数据也将被丢弃? 另外,数据可以在接收缓冲区中排队的最大缓冲区大小是多少,在数据丢失的限制之后是什么?
答案 0 :(得分:2)
即使所有客户端同时发送数据,我也必须调用recvfrom()40次才能接收所有40个客户端的数据。
换句话说,您要问网络堆栈是否可以组合单独的UDP数据报。答案是:不,他们会作为单独的数据报到达,需要单独调用recvfrom()
。
另外,我想知道40个客户端的所有数据都将在接收缓冲区中排队,或者某些数据也将被丢弃?
UDP不保证交付。数据包可以沿着路由的任何位置丢弃:发送主机,路由上的任何设备和接收主机。
此外,数据可以在接收缓冲区中排队的最大缓冲区大小是多少,以及数据丢失的限制是什么?
这取决于操作系统,通常是可配置的。请记住,数据包可能会在到达接收主机之前被丢弃。
答案 1 :(得分:2)
确实,这完全取决于操作系统套接字缓冲区的大小。在Linux中它的配置相当容易,所以你可能需要谷歌如何为你的Windows系统更改它。