Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何处理UDP应用程序中的客户端或服务器停机_C_Windows_Winapi_Udp - Fatal编程技术网

C 如何处理UDP应用程序中的客户端或服务器停机

C 如何处理UDP应用程序中的客户端或服务器停机,c,windows,winapi,udp,C,Windows,Winapi,Udp,我正在使用UDP开发一个用于客户机-服务器通信的windows应用程序,但由于UDP是无连接的,因此每当客户机停机时,服务器都不知道客户机已关闭,并不断发送数据。服务器关闭时的情况也类似。 我如何满足这样的条件,即当任何客户端或服务器停机时,另一方必须知道并能够处理它。 等待答复。您的问题超出UDP的范围。要实现这一点,您需要通过UDP实现自己的协议 一个简单的想法是定期发送(另一方面,TCP具有此功能) 您可以有一个简单的实现,如下所示: 让后台线程继续发送这些消息并等待回复 收到回复后,您

我正在使用UDP开发一个用于客户机-服务器通信的windows应用程序,但由于UDP是无连接的,因此每当客户机停机时,服务器都不知道客户机已关闭,并不断发送数据。服务器关闭时的情况也类似。 我如何满足这样的条件,即当任何客户端或服务器停机时,另一方必须知道并能够处理它。
等待答复。

您的问题超出UDP的范围。要实现这一点,您需要通过UDP实现自己的协议

一个简单的想法是定期发送(另一方面,TCP具有此功能)

您可以有一个简单的实现,如下所示:

  • 让后台线程继续发送这些消息并等待回复
  • 收到回复后,您可以填充某种数据结构 或包含活动设备列表的文件
  • 其他主线程(或多个线程)可能有以下更改:

  • 在发送任何数据之前,请检查要发送到的客户端是否存在于该文件/数据结构中
  • 如果没有,请跳过此客户端
  • 对填充的文件/数据结构中的所有剩余客户端重复上述操作
我在上面的实现中看到的一个问题与从主线程的角度来看的类似

使用以下类比,而不是

  • i1
    =发送keepalive消息的后台线程
  • i2
    =发送/接收数据并执行其他任务的主线程
  • i2
    尝试读取
    i1
    填充的数据结构/文件,然后
    i1
    更新它时,就会出现原始危险
  • 这意味着(最坏的情况),
    i2
    将无法获得更新的列表,这样它可能会错过一些客户端
  • 如果这种损失非常严重,我可以建议您可能有一种机制,
    i1
    将在完成任何正在进行的编写时向
    i2
    发出信号
  • 如果这种损失不是很严重,那么您可以跳过上述机制以加快程序的速度

保留邮件的说明: 您只需要发送一条非常轻量级的消息(通常没有数据,只有标题信息)确保此消息是唯一的。您不希望另一条消息被解释为keepalive消息

您可以使用
sendto()
调用来发送此消息。发送完成后,使用
recv()
等待回复一段时间

在数据结构/文件中记录每个回复。超时过期后,让线程休眠一段时间。当该时间到期时,重复上述过程


为了帮助您开始编写好的、健壮的网络代码,请仔细阅读。真是太棒了。它解释了许多概念。

您所问的超出了UDP的范围。要实现这一点,您需要通过UDP实现自己的协议

一个简单的想法是定期发送(另一方面,TCP具有此功能)

您可以有一个简单的实现,如下所示:

  • 让后台线程继续发送这些消息并等待回复
  • 收到回复后,您可以填充某种数据结构 或包含活动设备列表的文件
  • 其他主线程(或多个线程)可能有以下更改:

  • 在发送任何数据之前,请检查要发送到的客户端是否存在于该文件/数据结构中
  • 如果没有,请跳过此客户端
  • 对填充的文件/数据结构中的所有剩余客户端重复上述操作
我在上面的实现中看到的一个问题与从主线程的角度来看的类似

使用以下类比,而不是

  • i1
    =发送keepalive消息的后台线程
  • i2
    =发送/接收数据并执行其他任务的主线程
  • i2
    尝试读取
    i1
    填充的数据结构/文件,然后
    i1
    更新它时,就会出现原始危险
  • 这意味着(最坏的情况),
    i2
    将无法获得更新的列表,这样它可能会错过一些客户端
  • 如果这种损失非常严重,我可以建议您可能有一种机制,
    i1
    将在完成任何正在进行的编写时向
    i2
    发出信号
  • 如果这种损失不是很严重,那么您可以跳过上述机制以加快程序的速度

保留邮件的说明: 您只需要发送一条非常轻量级的消息(通常没有数据,只有标题信息)确保此消息是唯一的。您不希望另一条消息被解释为keepalive消息

您可以使用
sendto()
调用来发送此消息。发送完成后,使用
recv()
等待回复一段时间

在数据结构/文件中记录每个回复。超时过期后,让线程休眠一段时间。当该时间到期时,重复上述过程


为了帮助您开始编写好的、健壮的网络代码,请仔细阅读。真是太棒了。它解释了许多概念。

一个常见的解决方案是打开第二个TCP连接来检测断开的连接,以及发送任何关键消息。这是基于这样一种假设,即TCP连接很少保持正常,但UDP连接失败,因为两个端点是相同的。@聪旭,是的,你是对的。但是,如果要使用TCP连接,则可以使用它发送数据