c++ - 通过为每个对等方创建新套接字来执行 Ping

标签 c++ qt sockets networking

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

该应用程序有一个小的“ping”功能,它会尝试连接到对等点并请求一个小挑战(即发送一些自定义数据并回复一些自定义数据)以查看它是否存在。

我为每个对等点打开一个套接字,因此一旦 ping 开始,我们就会在 SYN_SENT 中有多个套接字。

这是实现具有质询的类似 ping 协议(protocol)的正确方法吗?我在浪费 socket 吗?有没有更好的方法我应该这样做?

最佳答案

我会说你的选择是:

  1. 实际 ping(使用 ICMP 回显数据包)。这具有较低的开销,但只会告诉您主机是否已启动。它要求您处理丢失的数据包、超时和重新传输。

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

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

    <

因此,最后,您必须判断:如果将有数千台主机参与并且此 ping 将频繁发生,那么您最好编写一个 UDP 解决方案。如果 ping 很少见,或者您不希望有那么多对等方,我会选择 TCP 路由。 (而且我不认为这是“套接字的浪费”——这些优点是 TCP 如此常用的原因。)

关于c++ - 通过为每个对等方创建新套接字来执行 Ping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029543/

相关文章:

c++ - 谁取得 IErrorInfo 的所有权?

qt - 仅使用样式表部分设置背景颜色

sockets - 原始套接字问题: Are TCP packets passed to a raw socket?

c++ - SFINAE:static_assert 与 std::enable_if

c++ - 为什么这个模板递归无法编译?

qt - QShortCut和QSpinBox冲突

c++ - 跨c套接字的Blowfish加解密

java - Android TCP - 应用程序关闭时套接字不会断开连接

c++ - 在函数方法中使用 std::thread

qt - 如何从qmake构建的Qt项目中转存?