在一个套接字上的多个UDP数据包
问题描述:
假设我有一个有多个客户端(UDP)的服务器。每当从客户端收到一个数据包时,服务器将花费1秒处理数据包,并在处理后立即向所有客户端发送一个新数据包。在一个套接字上的多个UDP数据包
如果10个数据包在0.1秒内到达,服务器是否可以做到这一点?换句话说,是否能够在处理完第一个接收到的数据包之后立即向每个客户端发送一个新数据包? (我有一个插座会得到由9个其他未读取数据包“堵塞”了的感觉)
服务器循环将是这样的:
while (1) {
read_a_packet()
process_packet()
send_new_packet_to_all_clients()
}
答
传入UDP数据包放入缓冲区,以便查询。如果你的处理速度足够慢以便用数据包填充套接字缓冲区,那么下面的数据包将被丢弃。
另请参阅How does a Linux socket buffer overflow?和C++ UDP sockets packet queuing(也请查看评论)。
答
根据您自己的定义,process_packet()
需要1秒钟的时间才能运行。线程一次只能做一件事,因此单个线程中的这种循环服务器将需要10秒来处理10个数据包。所以要么加速process_packet()
小于1秒,要么运行多个处理线程,以便可以并行处理多个数据包。
我不关心如何填充缓冲区,但是使用这个: 如果套接字缓冲区部分被填满,当我尝试发送一个数据包时会发生什么? – user990814
缓冲区已满时,您可能会担心丢失数据包。至于发送数据包 - 无论套接字输入的状态如何,您都可以随时发送数据包。 –
好的谢谢。其实我给的数字是夸张的,在我的应用程序中,处理时间通常远低于接收到的数据包之间的时间,但我想知道如果正在处理另一个数据包时收到数据包会发生什么情况。 – user990814