1

我开发了一个 udp 服务器/客户端应用程序,其中服务器有一个套接字,它可以连续接收来自 40 个客户端的数据。现在我想知道如果所有 40 个客户端同时发送数据会发生什么?根据我的理解,数据必须在接收缓冲区中排队,下次当我调用 recvfrom() 时,缓冲区中排队的数据会被接收,即我必须调用 recvfrom() 40 次才能接收所有 40 个客户端的数据,即使所有客户端同时发送数据。另外,我想知道40个客户端的所有数据都会在接收缓冲区中排队,还是部分数据也会被丢弃?另外,数据可以在接收缓冲区中排队的最大缓冲区大小是多少,在什么限制之后数据被丢弃?

4

2 回答 2

2

即使所有客户端同时发送数据,我也必须调用 recvfrom() 40 次才能接收所有 40 个客户端的数据。

换句话说,您是在询问网络堆栈是否可以组合单独的 UDP 数据报。答案是:不,它们将作为单独的数据报到达,需要单独调用recvfrom().

另外,我想知道40个客户端的所有数据都会在接收缓冲区中排队,还是部分数据也会被丢弃?

UDP 不保证交付。数据包可以被丢弃在路由的任何地方:发送主机、路由上的任何设备以及接收主机。

另外,数据可以在接收缓冲区中排队的最大缓冲区大小是多少,在什么限制之后数据被丢弃?

这取决于操作系统,通常是可配置的。请记住,数据包可能在到达接收主机之前就被丢弃。

于 2013-04-12T07:43:12.320 回答
2

事实上,这一切都取决于您的操作系统套接字缓冲区的大小。在 linux 中,它相当容易配置,所以你可能需要做的就是谷歌如何为你的 Windows 系统更改它。

于 2013-04-12T07:43:19.410 回答