【问题标题】:Checking open UDP Port in C++在 C++ 中检查打开的 UDP 端口
【发布时间】:2023-04-07 23:43:01
【问题描述】:

如何使用本机 C++ 检查远程 UDP 端口是否打开?由于 UDP 是无连接的,因此调用 connect() 没有帮助。我无法尝试绑定它,因为它不是本地的。 nmap 也不能说明。 (但是netstat 可以找到,但我认为它会查看有关打开端口/文件的内部信息)。反正有检测吗?如果我在网络级别向下一层,是否可以通过 C++ 发送 ICMP 消息来检查端口不可达状态?我的意思是,这是否会提供有关端口状态的足够信息?

平台是 Linux。

【问题讨论】:

  • “Native C++”在什么操作系统/平台上?
  • 这里的语言不是问题,而是代码执行的特权级别。例如,您可以像 nmap 一样从您的 C++ 代码中使用 libpcap 库。另外,我认为如果您尝试nmap 的所有选项,您至少会得到有关端口是否可能打开或过滤的指示,即使在所有情况下都不能100% 确定。 netstatnmap 你在哪里使用?
  • netstat -lptun 表示在端口 1060 上打开了一个 UDP 端口,但是我似乎忘记了 -sU 用于 nmap。它需要 root 访问才能找出(并且它正确地找出),为什么?
  • (关于nmap)它已经足够低级了。它基本上利用某些启发式方法来分类观察到的行为是否意味着端口是打开的。但因为这是非常低级的,它需要超级用户权限。
  • @STATUS_ACCESS_DENIED 这些都与远程端口无关。

标签: c++ network-programming udp port port-scanning


【解决方案1】:

没有万无一失的方法可以检查远程端口是否已准备好接收您的 UDP 数据报。由于 UDP 是无连接的,您只需判断远程主机是否正在回答对您有意义的内容。可能有一些方法可以获得提示(就像端口扫描器所做的那样),但这不是我在生产代码中所依赖的。

【讨论】:

    【解决方案2】:

    我假设您正在尝试确定远程计算机上的 UDP 端口是否正在通过防火墙和/或是否有应用程序在其上运行。

    您无法可靠地确定这一点。最接近的方法是尝试向该地址和端口发送一系列小数据报,间隔约 1 秒,持续约 10 秒。

    如果没有防火墙阻止端口并且没有应用程序正在运行,那么远程系统可能会发回ICMP_UNREACH_PORT(端口无法访问)。如果没有阻止防火墙并且远程系统已关闭,路由器可能会发回ICMP_UNREACH_HOSTICMP_UNREACH_NET。如果防火墙阻止了您,它可能会发回 ICMP_UNREACH_FILTER_PROHIB,但大多数防火墙不会发回任何内容。

    因为大多数防火墙都会阻止这种 ICMP 反馈,因此恢复其中任何一个的可能性非常小。即使确实返回了 ICMP 消息,除非您以 root 身份运行,否则 linux 通常不会让您看到它。某些操作系统会将 ICMP 错误报告为下一个sendto() 到同一地址/端口的失败,这就是您需要多次重复该消息的原因。但有些没有,在这种情况下,您必须打开特定的 ICMP 端口并解析任何返回消息。

    即使您确实以某种方式收到 ICMP 消息,也要了解它们并不可靠。例如,您可能会收到ICMP_UNREACH_PORT,即使应用程序不仅在监听,而且还在主动向您发送数据。 (这种情况很少见,但我见过。)

    如果一个应用程序正在给定端口上运行,并且如果您知道该应用程序是什么,并且如果您知道如何制作将导致该应用程序响应您的消息,那么这样做并获得响应是最好的指示端口是开放的。但是没有响应意味着什么:也许端口被阻塞,也许应用程序没有运行,或者它只是不喜欢你的消息。

    底线:不,不是。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多