我正在开发一个使用 UDP 进行客户端服务器通信的 Windows 应用程序,但由于 UDP 是无连接的,所以每当客户端出现故障时,服务器不知道客户端已关闭并继续发送数据。服务器关闭时的情况类似。我怎样才能满足这种情况,即每当客户端或服务器中的任何一个发生故障时,对方都必须知道并且可以处理它。等待回复。
问问题
963 次
1 回答
4
您要问的内容超出了 UDP 的范围。您需要通过 UDP 实现自己的协议来实现这一点。
一个简单的想法可能是定期发送keepalive 消息(另一方面,TCP 具有此功能)。
您可以有一个简单的实现,如下所示:
- 让后台线程继续发送这些消息并等待回复。
- 收到回复后,您可以使用活动设备列表填充某种数据结构或文件。
您的其他主线程(或多个线程)可以有以下更改:
- 在发送任何数据之前,请检查您要发送到的客户端是否存在于该文件/数据结构中。
- 如果没有,请跳过此客户端。
- 对填充的文件/数据结构中的所有剩余客户端重复上述操作。
我在上述实现中看到的一个问题类似于从主线程的角度来看的RAW 危险。
使用以下类比而不是提到的 RAW 危险示例,
i1
=您发送keepalive消息的后台线程。i2
=发送/接收数据并执行其他任务的主线程(或多个线程)。- 此处的 RAW 危险是
i2
尝试读取i1
之前i1
填充的数据结构/文件时已对其进行了更新。 - 这意味着(最坏的情况),
i2
不会得到更新的列表,这样可能会错过一些客户。 - 如果这种损失很严重,我可以建议你可能有一种机制,当它完成任何正在进行的写入时
i1
会发出信号。i2
- 如果这种损失不是很严重,那么您可以跳过上述机制以使您的程序更快。
Keepalive 消息说明:
您只需要发送一个非常轻量级的消息(通常没有数据。只是标题信息)。确保此消息是唯一的。您不希望另一条消息被解释为保活消息。
sendto()
您可以通过呼叫广播地址来发送此消息。完成发送后,使用 等待特定超时的回复recv()
。
将每个回复记录在数据结构/文件中。超时到期后,让线程休眠一段时间。当该时间到期时,重复上述过程。
为了帮助您开始编写良好、健壮的网络代码,请阅读Beej 的网络编程指南。这绝对是美妙的。它解释了许多概念。
于 2013-03-27T06:20:23.823 回答