【问题标题】:How to handle when a Client or Server is Down in a UDP Application在 UDP 应用程序中客户端或服务器关闭时如何处理
【发布时间】:2013-03-27 05:16:57
【问题描述】:

我正在开发一个使用 UDP 进行客户端服务器通信的 Windows 应用程序,但由于 UDP 是无连接的,因此每当客户端出现故障时,服务器不知道客户端已关闭并继续发送数据。服务器关闭时的情况类似。 我该如何应对这种情况,即每当客户端或服务器中的任何一个发生故障时,对方都必须知道并且可以处理它。 等待回复。

【问题讨论】:

    标签: c windows winapi udp


    【解决方案1】:

    您所问的超出了 UDP 的范围。您需要通过 UDP 实现自己的协议来实现这一点。

    一个简单的想法可能是定期发送keepalive messages(另一方面,TCP 具有此功能)。

    你可以有一个简单的实现如下:

    • 让后台线程继续发送这些消息并等待回复。
    • 收到回复后,您可以填充某种数据结构 或包含活动设备列表的文件。
    • 您的其他主线程(或多个线程)可以有以下更改:

      1. 在发送任何数据之前,请检查您要发送到的客户端是否存在于该文件/数据结构中。
      2. 如果没有,请跳过此客户端。
      3. 对填充的文件/数据结构中的所有剩余客户端重复上述操作。

    从主线程的角度来看,我在上述实现中看到的一个问题类似于RAW hazard

    使用以下类比代替mentioned example for the RAW hazard

    • i1 = 您发送 keepalive 消息的后台线程。
    • i2 = 您的主线程(或多个线程)发送/接收数据并执行您的其他任务。
    • 这里的 RAW 危险是i2 尝试读取由i1 填充的数据结构/文件之前 i1 更新它。
    • 这意味着(最坏的情况)i2 将无法获得更新的列表,这样可能会错过一些客户。
    • 如果这种损失很严重,我可以建议你可能有一种机制,i1 将在完成任何正在进行的写入时向i2 发出信号。
    • 如果这种损失不是很严重,那么您可以跳过上述机制以使您的程序更快。

    Keepalive 消息说明:

    您只需要发送一个非常轻量级的消息(通常没有数据。只有标头信息)。 确保这条消息是独一无二的。您希望另一条消息被解释为 keepalive 消息。

    您可以通过调用sendto()broadcast address 发送此消息。完成发送后,使用recv() 等待一定超时的回复。

    将每个回复记录在数据结构/文件中。超时到期后,让线程休眠一段时间。当该时间到期时,重复上述过程。

    为了帮助您开始编写良好、健壮的网络代码,请访问Beej's Guide to Network Programming。这绝对是美妙的。它解释了许多概念。

    【讨论】:

    • 一种常见的解决方案是打开第二个 TCP 连接以检测断开的连接,并发送任何关键消息。这是基于这样的假设,即 TCP 连接保持正常但 UDP 连接失败的情况非常罕见,因为这两个端点是相同的。
    • @CongXu,是的,你是对的。但是,如果要使用 TCP 连接,它可以用来发送数据本身(因为 TCP 有这种检测)。就像你说的,也许只针对关键数据。
    • @AnishRam :这很有帮助 :) 你能给我举个例子吗?
    • @AnishRam 我们不是已经在假设我们想要使用 UDP 而不是 TCP,无论出于何种原因? :) 有关我正在谈论的真实示例,请查看RTSP,它用于流媒体,但也允许类似 VCR 的命令。 RTP (over UDP) 用于实际数据传输,TCP 用于 VCR-like 命令(暂停/播放、ff、rew)。
    • @AyeshaHassan,那么当您需要某样东西但它不存在时,您会怎么做?当然是发明它!我已经编辑了我的答案以解释我对 keepalive 消息的含义。至于示例代码,请通过the link I mentioned in my answer 帮助您入门。它清楚地解释了几个概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2012-03-05
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多