通过为每个对等方创建新套接字来进行Ping

时间:2017-02-03 17:13:21

标签: c++ qt sockets networking

我在C ++中使用Qt套接字创建了一个小型跨平台应用程序(虽然这不是C ++或Qt特定的问题)。

该应用程序有一个小小的" ping"试图连接到对等体并要求一个小的挑战(即发送一些自定义数据和回复一些自定义数据)以查看它是否存活的功能。

我为每个对等方打开一个套接字,所以一旦ping开始,我就会在SYN_SENT中有几个套接字。

这是一种通过挑战实现类ping协议的正确方法吗?我在浪费插座吗?我有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我会说你的选择是:

  1. 实际ping(使用ICMP echo数据包)。这开销很低,但只能告诉您主机是否已启动。它需要您处理丢失的数据包,超时和重新传输。

  2. 基于UDP的协议。这也有较低的内核开销,但您将负责设置超时,处理丢失的数据包和重新传输。它的优点是可以让您肯定地确认您的程序在同级上运行。无论您添加多少个对等端,它都可以仅使用单个套接字端点实现。 (如果所有节目都在本地网络上,或者多播[需要复杂的设置],您也可以使用广播一次发送给多个节点。)

  3. 正在进行TCP套接字。这更容易编码,非常可靠并且会自动提供超时(即如果对等方没有响应,您的WHERE最终会失败)。它可以让您确定您的同伴在那里并运行您的程序。虽然这有更多的内核开销,并且您将在每个对等系统的主机上使用一个套接字端点,但我不会将其称为重要问题,除非您认为您将拥有数千个对等体。

  4. 所以,最后,你必须判断:如果有数千台主机参与,并且这种ping会经常发生,你可能最好编写一个UDP解决方案。如果ping很少见,或者你不期望这么多对等,我会去TCP路由。 (我不会认为这是“浪费套接字” - 这些优点是TCP如此常用的原因。)

答案 1 :(得分:0)

问题中描述的技术并没有真正实现ping连接,也没有测试连接本身是否存在。该技术仅检查对等方正在监听(并响应)新连接......

您所描述的更多的是服务器?"测试而不是" keep-alive"平。

如果我们正在讨论" keep-alive" ping,这项技术将失败。

例如,如果只关闭了连接的readwrite方面,您就不会知道。此外,如果连接未正确关闭(即,由于中间人断开了连接),此ping将不会暴露问题。

最重要的是,对于某些网络连接和协议,您不会重置连接超时...因此,如果您的对等方正在检查连接超时,则此ping赢了&#39 ; t帮助。

对于" keep-alive" ping,我建议你实现一个特定的协议ping

确保ping在现有(相同)连接中执行,并且从不要求您打开新连接。