【发布时间】:2013-03-27 05:16:57
【问题描述】:
我正在开发一个使用 UDP 进行客户端服务器通信的 Windows 应用程序,但由于 UDP 是无连接的,因此每当客户端出现故障时,服务器不知道客户端已关闭并继续发送数据。服务器关闭时的情况类似。 我该如何应对这种情况,即每当客户端或服务器中的任何一个发生故障时,对方都必须知道并且可以处理它。 等待回复。
【问题讨论】:
我正在开发一个使用 UDP 进行客户端服务器通信的 Windows 应用程序,但由于 UDP 是无连接的,因此每当客户端出现故障时,服务器不知道客户端已关闭并继续发送数据。服务器关闭时的情况类似。 我该如何应对这种情况,即每当客户端或服务器中的任何一个发生故障时,对方都必须知道并且可以处理它。 等待回复。
【问题讨论】:
您所问的超出了 UDP 的范围。您需要通过 UDP 实现自己的协议来实现这一点。
一个简单的想法可能是定期发送keepalive messages(另一方面,TCP 具有此功能)。
你可以有一个简单的实现如下:
您的其他主线程(或多个线程)可以有以下更改:
从主线程的角度来看,我在上述实现中看到的一个问题类似于RAW hazard。
使用以下类比代替mentioned example for the RAW hazard,
i1 = 您发送 keepalive 消息的后台线程。i2 = 您的主线程(或多个线程)发送/接收数据并执行您的其他任务。i2 尝试读取由i1 填充的数据结构/文件之前 i1 更新它。i2 将无法获得更新的列表,这样可能会错过一些客户。i1 将在完成任何正在进行的写入时向i2 发出信号。 您只需要发送一个非常轻量级的消息(通常没有数据。只有标头信息)。 确保这条消息是独一无二的。您不希望另一条消息被解释为 keepalive 消息。
您可以通过调用sendto() 向broadcast address 发送此消息。完成发送后,使用recv() 等待一定超时的回复。
将每个回复记录在数据结构/文件中。超时到期后,让线程休眠一段时间。当该时间到期时,重复上述过程。
为了帮助您开始编写良好、健壮的网络代码,请访问Beej's Guide to Network Programming。这绝对是美妙的。它解释了许多概念。
【讨论】: