1

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

4

1 回答 1

4

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

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

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

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

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

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

使用以下类比而不是提到的 RAW 危险示例

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

Keepalive 消息说明:

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

sendto()您可以通过呼叫广播地址来发送此消息。完成发送后,使用 等待特定超时的回复recv()

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

为了帮助您开始编写良好、健壮的网络代码,请阅读Beej 的网络编程指南。这绝对是美妙的。它解释了许多概念。

于 2013-03-27T06:20:23.823 回答