C# “安全创建”;“心跳”;通过网络(Ping?)
我创建了扩展的TCP服务器和TCP客户端类(用C#)用于通过网络进行通信,以供我的项目使用 据我所知,客户机无法真正知道服务器是否停机,除非它请求某个期望得到答复但没有得到答复的内容 在我们的应用程序中,时间和可用性(服务器)是关键因素,因为它涉及到重型机器的自动化。因此,根据对设计的讨论,服务器应定期发送其“心跳”,以便在客户机在一段时间后没有从服务器收到任何信息的情况下,它将:C# “安全创建”;“心跳”;通过网络(Ping?),c#,sockets,tcp,network-programming,ping,C#,Sockets,Tcp,Network Programming,Ping,我创建了扩展的TCP服务器和TCP客户端类(用C#)用于通过网络进行通信,以供我的项目使用 据我所知,客户机无法真正知道服务器是否停机,除非它请求某个期望得到答复但没有得到答复的内容 在我们的应用程序中,时间和可用性(服务器)是关键因素,因为它涉及到重型机器的自动化。因此,根据对设计的讨论,服务器应定期发送其“心跳”,以便在客户机在一段时间后没有从服务器收到任何信息的情况下,它将: 开始尝试自己的恢复操作,如果仍然失败 它将向控制室的服务人员发出警报 我应该在服务器中实现“心跳”部分。我有创建“
hbdata
)很短(只有几个预先安排好的字节,以节省在多台机器上交谈的时间),并且是自定义的,而且由于服务器还发送hbdata
之外的一些其他数据,并且考虑到可能的延迟或其他意外情况,此hbdata
始终存在混淆的可能性。另外,在我的“心跳”实现中,客户端不需要向服务器回复任何内容
下面是我的问题:
Ping
是通过TCP实现这种心跳功能的更好的方法还是常见的方法?为什么Ping
,考虑到Ping
有reply,有没有实现无replyPing
的方法Ping
是一种ICMP回送请求-Ping通常由网络监控软件等使用,以确保客户端联机。通常,如果只是ping网络访问,则不需要实现自己的ping(请参阅)
还要注意,ping
根本不是通过TCP,而是通过ICMP,一种稍有不同的协议,用于网络诊断等。但这让我想到了第三点Ping
没有回复是毫无意义的。根据您的想法,我认为您需要的协议是UDP—您可以广播任意数据报,无需任何握手或应答(TCP定义为通过握手建立会话)—它只发送数据。这些套接字将使用SocketType.Dgram
而不是SocketType.Stream
,以及ProtocolType.Udp
而不是Tcp或ICMP。如果您想更多地参与进来,可以使用广播将相同的内容发送到整个LAN,或者使用多播发送到特定的客户机组编辑:刚刚看到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);
}