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

时间:2017-04-06 12:06:02

标签: udp client-server listener

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

如果我让所有客户端将数据报发送到同一端口,并且客户端B在服务器从客户端A接收数据的确切时间发送数据报,则服务器似乎将错过来自客户端A的数据。

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

1 个答案:

答案 0 :(得分:0)

当您将UDP套接字绑定到端口时,网络堆栈将为您分配有限数量的传入UDP数据包的缓冲区,以便(假设您以相对及时的方式调用recv()),没有传入的数据包应该迷路。

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

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

/proc/sys/net/core/wmem_default for send

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

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

 sysctl -w net.core.rmem_max=26214400

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

net.core.rmem_max=26214400

由于每个数据包只有10B,不应该是个问题。

如果您仍然担心数据包丢失,您可以实施一个协议,客户端等待来自服务器的ACK,否则它将重新发送。许多协议使用这样的功能,但这只有在时间允许的情况下才有可能。例如,在流数据中它没有用,因为没有时间重新发送。

或考虑使用tcp(如果是选项)