如何在UDP应用程序中关闭客户端或服务器时

时间:2013-03-27 05:16:58

标签: c windows winapi udp

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

1 个答案:

答案 0 :(得分:4)

您所询问的内容超出了UDP的范围。您需要通过UDP实现自己的协议才能实现此目的。

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

您可以按如下方式进行简单的实施:

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

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

我在上面的实现中看到的一个问题类似于主线程的RAW hazard

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

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

Keepalive消息的说明:

你只需要发送一个非常轻量级的消息(通常没有数据。只是标题信息)。 确保此邮件是唯一的。您希望将其他邮件解释为keepalive邮件。

您可以使用sendto()broadcast address发送此邮件。完成发送后,使用recv()等待特定超时的回复。

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

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