2013-04-12 90 views
0

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

回答

2

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

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

此外,我想知道40个客户端的所有数据将在接收缓冲区中排队,否则一些数据也会被丢弃?

UDP不保证传送。数据包可以放在路由的任何地方:通过发送主机,沿路由的任何设备和接收主机。

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

这是依赖于操作系统的,通常是可配置的。请记住,即使到达接收主机,数据包也可能会丢失。

+0

因此,如果数据从一个套接字的40个客户端到达,它将被缓冲在套接字缓冲区中吗?并且每次调用recvfrom()都会从套接字缓冲区读取数据? – Ayse

+2

它会被缓冲,如果它适合并放弃,如果不适合。 – EJP

2

的确,这一切都取决于您的OS套接字缓冲区的大小。在linux中它的配置相当简单,所以你可能需要这样做才能让谷歌如何改变你的Windows系统。

+0

因此,如果数据从套接字上的40个客户端到达,它将被缓冲在套接字缓冲区中吗?并且每次调用recvfrom()都会从套接字缓冲区读取数据? – Ayse

+1

..以及您多久呼叫一次recvfrom()。 –

+1

@AyeshaHassan,对。有一个由操作系统维护的共享套接字缓冲区,您可以通过它从recvfrom()等等获取数据。 – rmn

相关问题