我有1台服务器和几台(可能多达20台)客户端。所有客户端都在随机发送UDP数据报。每个数据报都很短(大约10B),但我必须确保每个客户端的所有数据都被正确接收。
如果我让所有客户端将数据报发送到同一端口,并且客户端B在服务器从客户端A接收数据的确切时间发送数据报,则服务器似乎将错过来自客户端A的数据。
那么做这项工作的正确方法是什么?我是否需要为20个客户端中的每一个创建一个监听器?
答案 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(如果是选项)