在UDP应用程序中当客户端或服务器closures时如何处理

我正在为使用UDP的Client Server通信开发一个Windows应用程序,但是因为UDP是无连接的,所以无论客户端何时closures,服务器都不知道客户端已closures,并一直发送数据。 服务器closures的情况也是如此。 我该如何处理这种情况,即当客户端或服务器出现故障时,另一方必须知道并处理该情况。 等待回复。

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

一个简单的想法可能是定期发送Keepalive消息 (TCP另一方面有这个功能)。

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

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

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

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

对于RAW危险 ,请使用下面的类比来代替上述示例 ,

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

Keepalive消息解释:

你只需要发送一个非常轻量级的消息(通常没有数据,只是头信息)。 确保此消息是唯一的 。 您希望将另一条消息解释为保持消息。

您可以使用sendto()调用发送此消息到广播地址 。 发送完成后,使用recv()等待某个超时的回复。

记录数据结构/文件中的每个回复。 超时后,让线程休眠一段时间。 届满时,重复上述过程。

为了帮助您开始编写好的强大的网络代码,请通过Beej的网络编程指南 。 这绝对是美好的。 它解释了许多概念。