我正在使用UDP开发用于客户端服务器通信的Windows应用程序,但由于UDP是无连接的,因此每当客户端关闭时,服务器都不知道客户端已关闭并继续发送数据。服务器关闭时的情况类似。 我怎样才能满足这样的条件,即当任何客户端或服务器出现故障时,另一方必须知道它并且可以处理它。 等待回复。
答案 0 :(得分:4)
您所询问的内容超出了UDP的范围。您需要通过UDP实现自己的协议才能实现此目的。
一个简单的想法可能是定期发送keepalive messages(另一方面TCP具有此功能)。
您可以按如下方式进行简单的实施:
您的其他主要线程(或多个线程)可以进行以下更改:
我在上面的实现中看到的一个问题类似于主线程的RAW hazard。
使用以下类比代替mentioned example for the RAW hazard,
i1
=发送keepalive消息的后台线程。i2
=发送/接收数据并执行其他任务的主线程(或多个线程)。i2
尝试在 i1
更新之前读取由i1
填充的数据结构/文件。< / LI>
i2
将无法获得更新的列表,并且可能会错过一些客户端。i1
在完成任何正在进行的写作时将发出i2
信号。 你只需要发送一个非常轻量级的消息(通常没有数据。只是标题信息)。 确保此邮件是唯一的。您不希望将其他邮件解释为keepalive邮件。
您可以使用sendto()
来broadcast address发送此邮件。完成发送后,使用recv()
等待特定超时的回复。
记录数据结构/文件中的每个回复。超时到期后,让线程进入休眠状态一段时间。当该时间到期时,重复上述过程。
为了帮助您开始编写良好,强大的网络代码,请浏览Beej's Guide to Network Programming。这绝对是美妙的。它解释了许多概念。