假设我有一个具有多个客户端(UDP)的服务器。每当从客户端收到数据包时,服务器将花费1秒钟处理数据包,并在处理后立即向所有客户端发送新数据包。
如果10个数据包在0.1秒内到达,服务器是否能够执行此操作?换句话说,它是否能够在处理完第一个接收到的数据包后立即向每个客户端发送新数据包? (我觉得套接字会被其他9个未读的数据包“堵塞”)
服务器循环如下:
while (1) {
read_a_packet()
process_packet()
send_new_packet_to_all_clients()
}
答案 0 :(得分:1)
将传入的UDP数据包放入缓冲区以供将来检索。如果您的处理速度足以用数据包填充套接字缓冲区,则只会丢弃以下数据包。
另请参阅How does a Linux socket buffer overflow?和C++ UDP sockets packet queuing(另请查看评论)。
答案 1 :(得分:0)
根据您自己的定义,process_packet()
需要1秒才能运行。一个线程一次只能做一件事,因此单个线程中的这种循环服务器将需要10秒来处理10个数据包。因此要么将process_packet()
加速到不到1秒,要么运行多个处理线程,这样就可以并行处理多个数据包。