C 如何处理UDP应用程序中的客户端或服务器停机
我正在使用UDP开发一个用于客户机-服务器通信的windows应用程序,但由于UDP是无连接的,因此每当客户机停机时,服务器都不知道客户机已关闭,并不断发送数据。服务器关闭时的情况也类似。 我如何满足这样的条件,即当任何客户端或服务器停机时,另一方必须知道并能够处理它。C 如何处理UDP应用程序中的客户端或服务器停机,c,windows,winapi,udp,C,Windows,Winapi,Udp,我正在使用UDP开发一个用于客户机-服务器通信的windows应用程序,但由于UDP是无连接的,因此每当客户机停机时,服务器都不知道客户机已关闭,并不断发送数据。服务器关闭时的情况也类似。 我如何满足这样的条件,即当任何客户端或服务器停机时,另一方必须知道并能够处理它。 等待答复。您的问题超出UDP的范围。要实现这一点,您需要通过UDP实现自己的协议 一个简单的想法是定期发送(另一方面,TCP具有此功能) 您可以有一个简单的实现,如下所示: 让后台线程继续发送这些消息并等待回复 收到回复后,您
等待答复。您的问题超出UDP的范围。要实现这一点,您需要通过UDP实现自己的协议 一个简单的想法是定期发送(另一方面,TCP具有此功能) 您可以有一个简单的实现,如下所示:
- 让后台线程继续发送这些消息并等待回复
- 收到回复后,您可以填充某种数据结构 或包含活动设备列表的文件
- 其他主线程(或多个线程)可能有以下更改:
- 在发送任何数据之前,请检查要发送到的客户端是否存在于该文件/数据结构中
- 如果没有,请跳过此客户端
- 对填充的文件/数据结构中的所有剩余客户端重复上述操作
=发送keepalive消息的后台线程i1
=发送/接收数据并执行其他任务的主线程i2
- 当
尝试读取i2
填充的数据结构/文件,然后i1
更新它时,就会出现原始危险i1
- 这意味着(最坏的情况),
将无法获得更新的列表,这样它可能会错过一些客户端i2
- 如果这种损失非常严重,我可以建议您可能有一种机制,
将在完成任何正在进行的编写时向i1
发出信号李>i2
- 如果这种损失不是很严重,那么您可以跳过上述机制以加快程序的速度
保留邮件的说明: 您只需要发送一条非常轻量级的消息(通常没有数据,只有标题信息)确保此消息是唯一的。您不希望另一条消息被解释为keepalive消息 您可以使用
sendto()
调用来发送此消息。发送完成后,使用recv()
等待回复一段时间
在数据结构/文件中记录每个回复。超时过期后,让线程休眠一段时间。当该时间到期时,重复上述过程
为了帮助您开始编写好的、健壮的网络代码,请仔细阅读。真是太棒了。它解释了许多概念。您所问的超出了UDP的范围。要实现这一点,您需要通过UDP实现自己的协议 一个简单的想法是定期发送(另一方面,TCP具有此功能) 您可以有一个简单的实现,如下所示:
- 让后台线程继续发送这些消息并等待回复
- 收到回复后,您可以填充某种数据结构 或包含活动设备列表的文件
- 其他主线程(或多个线程)可能有以下更改:
- 在发送任何数据之前,请检查要发送到的客户端是否存在于该文件/数据结构中
- 如果没有,请跳过此客户端
- 对填充的文件/数据结构中的所有剩余客户端重复上述操作
=发送keepalive消息的后台线程i1
=发送/接收数据并执行其他任务的主线程i2
- 当
尝试读取i2
填充的数据结构/文件,然后i1
更新它时,就会出现原始危险i1
- 这意味着(最坏的情况),
将无法获得更新的列表,这样它可能会错过一些客户端i2
- 如果这种损失非常严重,我可以建议您可能有一种机制,
将在完成任何正在进行的编写时向i1
发出信号李>i2
- 如果这种损失不是很严重,那么您可以跳过上述机制以加快程序的速度
保留邮件的说明: 您只需要发送一条非常轻量级的消息(通常没有数据,只有标题信息)确保此消息是唯一的。您不希望另一条消息被解释为keepalive消息 您可以使用
sendto()
调用来发送此消息。发送完成后,使用recv()
等待回复一段时间
在数据结构/文件中记录每个回复。超时过期后,让线程休眠一段时间。当该时间到期时,重复上述过程
为了帮助您开始编写好的、健壮的网络代码,请仔细阅读。真是太棒了。它解释了许多概念。一个常见的解决方案是打开第二个TCP连接来检测断开的连接,以及发送任何关键消息。这是基于这样一种假设,即TCP连接很少保持正常,但UDP连接失败,因为两个端点是相同的。@聪旭,是的,你是对的。但是,如果要使用TCP连接,则可以使用它发送数据