同步从多个客户端接收UDP数据的正确方法是什么?

同步从多个客户端接收UDP数据的正确方法是什么?,udp,client-server,listener,Udp,Client Server,Listener,我有一台服务器和几个(可能多达20个)客户端。所有客户端都随机发送UDP数据报。每个数据报都很短(大约10B),但我必须确保正确接收来自每个客户机的所有数据 如果我让所有客户机将数据报发送到同一端口,而客户机B在服务器从客户机A接收数据的确切时间发送数据报,那么服务器似乎会错过客户机A的数据 那么,做这项工作的正确方法是什么?我是否需要为20个客户端中的每个客户端创建一个侦听器?当您将UDP套接字绑定到端口时,网络堆栈将为有限数量的传入UDP数据包分配一个缓冲区,以便(假设您以相对及时的方式调用

我有一台服务器和几个(可能多达20个)客户端。所有客户端都随机发送UDP数据报。每个数据报都很短(大约10B),但我必须确保正确接收来自每个客户机的所有数据

如果我让所有客户机将数据报发送到同一端口,而客户机B在服务器从客户机A接收数据的确切时间发送数据报,那么服务器似乎会错过客户机A的数据


那么,做这项工作的正确方法是什么?我是否需要为20个客户端中的每个客户端创建一个侦听器?

当您将UDP套接字绑定到端口时,网络堆栈将为有限数量的传入UDP数据包分配一个缓冲区,以便(假设您以相对及时的方式调用recv())不会丢失传入数据包

如果您想在终端中查看缓冲区大小,可以查看:

/proc/sys/net/core/rmem_default for recv 

我认为Linux上的默认缓冲区大小是131071B

在Linux上,您可以(以root用户身份)更改UDP缓冲区大小(例如,更改为26214400):

您还可以通过将此行添加到/etc/sysctl.conf使其永久化:

net.core.rmem_max=26214400
因为每个数据包只有10B,所以不应该是问题

如果您仍然担心数据包丢失,您可以实现一个协议,在该协议中,您的客户机等待来自服务器的ACK,或者它将重新发送。许多协议都使用这种特性,但这只有在时间允许的情况下才可能实现。例如,在流式传输数据中,它没有用处,因为没有时间重新发送

或考虑使用TCP(如果它是一个选项)

 sysctl -w net.core.rmem_max=26214400
net.core.rmem_max=26214400