【问题标题】:Multiple UDP packets at a socket一个套接字上的多个 UDP 数据包
【发布时间】:2011-12-05 20:45:31
【问题描述】:

假设我有一个带有多个客户端 (UDP) 的服务器。每当收到来自客户端的数据包时,服务器将花费 1 秒时间处理该数据包,并在处理后立即将新数据包发送给所有客户端。

如果 0.1 秒内有 10 个数据包到达,服务器是否能够做到这一点?换句话说,它是否能够在处理完第一个接收到的数据包后立即向每个客户端发送一个新数据包? (我感觉套接字会被其他 9 个未读数据包“堵塞”)

服务器循环如下:

while (1) {
    read_a_packet()
    process_packet()
    send_new_packet_to_all_clients()
}

【问题讨论】:

    标签: sockets udp packets


    【解决方案1】:

    传入的 UDP 数据包被放入缓冲区以供将来检索。如果您的处理速度慢到足以用数据包填充套接字缓冲区,则后续数据包将被丢弃。

    另请参阅 How does a Linux socket buffer overflow?C++ UDP sockets packet queuing(也可以查看那里的 cmets)。

    【讨论】:

    • 我不关心填充缓冲区,但我关心的是:如果套接字缓冲区被部分填充,当我尝试发送数据包时会发生什么?
    • 您可能会担心缓冲区已满时会丢失数据包。至于发送数据包 - 无论套接字输入的状态如何,您都可以随时发送它们。
    • 好的,谢谢。实际上我给出的数字是夸张的;在我的应用程序中,处理时间通常远低于接收数据包之间的时间,但我想知道如果在处理另一个数据包的同时接收到一个数据包会发生什么。
    【解决方案2】:

    根据您自己的定义,process_packet() 需要 1 秒才能运行。一个线程一次只能做一件事,所以这样一个单线程中的循环服务器将需要 10 秒来处理 10 个数据包。因此,要么将process_packet() 加速到不到 1 秒,要么运行多个处理线程,以便您可以并行处理多个数据包。

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2019-06-05
      • 2011-07-25
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多