我正在为使用UDP的Client Server通信开发一个Windows应用程序,但是因为UDP是无连接的,所以无论客户端何时closures,服务器都不知道客户端已closures,并一直发送数据。 服务器closures的情况也是如此。 我该如何处理这种情况,即当客户端或服务器出现故障时,另一方必须知道并处理该情况。 等待回复。
你所要求的超出了UDP的范围。 你需要通过UDP来实现你自己的协议来实现这一点。
一个简单的想法可能是定期发送Keepalive消息 (TCP另一方面有这个功能)。
你可以有一个简单的实现,如下所示:
您的其他主线程(或线程)可以有以下更改:
在上面的实现中我能看到的一个问题类似于主线程的RAW危害 。
对于RAW危险 ,请使用下面的类比来代替上述示例 ,
i1
=发送Keepalive消息的后台线程。 i2
=发送/接收数据并执行其他任务的主线程(或线程)。 i2
在 i1
更新之前尝试读取由i1
填充的数据结构/文件。 i2
不会得到更新的列表,并且可能以这种方式漏掉一些客户端。 i1
在完成任何正在进行的写作时发出信号。 你只需要发送一个非常轻量级的消息(通常没有数据,只是头信息)。 确保此消息是唯一的 。 您不希望将另一条消息解释为保持消息。
您可以使用sendto()
调用发送此消息到广播地址 。 发送完成后,使用recv()
等待某个超时的回复。
记录数据结构/文件中的每个回复。 超时后,让线程休眠一段时间。 届满时,重复上述过程。
为了帮助您开始编写好的强大的网络代码,请通过Beej的网络编程指南 。 这绝对是美好的。 它解释了许多概念。