Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# “安全创建”;“心跳”;通过网络(Ping?)_C#_Sockets_Tcp_Network Programming_Ping - Fatal编程技术网

C# “安全创建”;“心跳”;通过网络(Ping?)

C# “安全创建”;“心跳”;通过网络(Ping?),c#,sockets,tcp,network-programming,ping,C#,Sockets,Tcp,Network Programming,Ping,我创建了扩展的TCP服务器和TCP客户端类(用C#)用于通过网络进行通信,以供我的项目使用 据我所知,客户机无法真正知道服务器是否停机,除非它请求某个期望得到答复但没有得到答复的内容 在我们的应用程序中,时间和可用性(服务器)是关键因素,因为它涉及到重型机器的自动化。因此,根据对设计的讨论,服务器应定期发送其“心跳”,以便在客户机在一段时间后没有从服务器收到任何信息的情况下,它将: 开始尝试自己的恢复操作,如果仍然失败 它将向控制室的服务人员发出警报 我应该在服务器中实现“心跳”部分。我有创建“

我创建了扩展的TCP服务器和TCP客户端类(用C#)用于通过网络进行通信,以供我的项目使用

据我所知,客户机无法真正知道服务器是否停机,除非它请求某个期望得到答复但没有得到答复的内容

在我们的应用程序中,时间和可用性(服务器)是关键因素,因为它涉及到重型机器的自动化。因此,根据对设计的讨论,服务器应定期发送其“心跳”,以便在客户机在一段时间后没有从服务器收到任何信息的情况下,它将:

  • 开始尝试自己的恢复操作,如果仍然失败
  • 它将向控制室的服务人员发出警报
  • 我应该在服务器中实现“心跳”部分。我有创建“心跳”的简单实现

    到目前为止,它工作正常,但有一件事让我担心,那就是心跳数据(
    hbdata
    )很短(只有几个预先安排好的字节,以节省在多台机器上交谈的时间),并且是自定义的,而且由于服务器还发送
    hbdata
    之外的一些其他数据,并且考虑到可能的延迟或其他意外情况,此
    hbdata
    始终存在混淆的可能性。另外,在我的“心跳”实现中,客户端不需要向服务器回复任何内容

    下面是我的问题:

  • 我的担心没有充分的根据(到目前为止还不错)?有什么缺陷吗
  • Ping
    是通过TCP实现这种心跳功能的更好的方法还是常见的方法?为什么
  • 如果要实现
    Ping
    ,考虑到
    Ping
    有reply,有没有实现无reply
    Ping
    的方法
  • 有什么建议可以让心跳在尽可能短的数据量内变得足够强劲
  • 在我的“心跳”实现中,客户端不需要向服务器回复任何内容

    应用程序级保持生命需要双向的,不是吗?上述功能的作用是,客户端可以确保服务器在接收到心跳时处于活动状态且健康。如果客户端没有响应,服务器将不知道客户端的真实状态。如果无法访问客户机,心跳会堆积在服务器发送缓冲区中。服务器应用程序将忽略这一事实

    我的担心没有充分的根据(到目前为止还不错)?有什么缺陷吗

    小字节应该不是问题。心跳越小越好

    Ping是通过TCP实现心跳功能的更好的方法还是常见的方法?为什么

    即使客户端应用程序已关闭,但系统运行正常,Ping也将为正

  • 这可能是最难回答的问题。你能提供更多的细节吗?为什么您认为您的服务器不能处理发送超过几个字节的数据?我们这里说的是成千上万的机器吗?所有的东西都在本地局域网上吗,还是跨多个网络或internet

  • Ping
    是一种ICMP回送请求-Ping通常由网络监控软件等使用,以确保客户端联机。通常,如果只是ping网络访问,则不需要实现自己的ping(请参阅)

    还要注意,
    ping
    根本不是通过TCP,而是通过ICMP,一种稍有不同的协议,用于网络诊断等。但这让我想到了第三点

  • Ping
    没有回复是毫无意义的。根据您的想法,我认为您需要的协议是UDP—您可以广播任意数据报,无需任何握手或应答(TCP定义为通过握手建立会话)—它只发送数据。这些套接字将使用
    SocketType.Dgram
    而不是
    SocketType.Stream
    ,以及
    ProtocolType.Udp
    而不是Tcp或ICMP。如果您想更多地参与进来,可以使用广播将相同的内容发送到整个LAN,或者使用多播发送到特定的客户机组

  • 再说一次,你确定你需要对限制交通等问题如此关注吗

    就我个人而言,我会将其翻转过来,让客户机以设定的间隔“签入”,并向服务器报告状态代码。如果服务器注意到客户机有一段时间没有签入,它应该向客户机发送一条消息并期望得到回复

    如果你真的在扩展它时遇到问题,我会让服务器以设定的间隔通过UDP发送“心跳”,如果客户端认为它缺少心跳,就有一种机制让它点击服务器并请求回复——如果没有得到响应,就发出警报


  • 编辑:刚刚看到Prabhu的答案-他是对的,
    ping
    只会告诉您计算机是否已启动,您肯定希望实际应用程序中的某些内容能够报告回来,而不仅仅是网络连接的状态。

    谢谢,这给了我一些见解。我知道Ping不够好,无法查看服务是否正常,并建议在应用程序级别查看保持有效性的最佳方法是双向通信。但是大小不是这里真正的问题。感谢您澄清Ping是ICMP而不是TCP,如果我们使用它,需要得到回复。是的,我认为这种单向信息发送的正确术语不是“Ping”。这只是我的有限任期。我也考虑客户发送消息的可能性,但不幸的是,在设计中还没有达成一致意见。
    public void SendHeartBeatToAllClients(byte[] hbdata) {
      foreach (Socket socket in clientNoSocketList.Select(x => x.Value).ToList())
        socket.Send(hbdata);      
    }