c++ - 在 C++ 中检查打开的 UDP 端口

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

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

平台是 Linux。

最佳答案

我假设您正在尝试确定远程计算机上的 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,即使应用程序不仅在监听,而且还在主动向您发送数据。 (这种情况很少见,但我见过。)

如果一个应用程序正在给定的端口上运行,并且如果您知道该应用程序是什么,并且如果您知道如何制作一条消息以使该应用程序响应您,那么这样做并获得响应是最好的指示该端口已打开。但没有得到任何回应意味着什么:可能端口被阻止,可能应用程序没有运行,或者它可能只是不喜欢你的信息。

底线:不,不是真的。

关于c++ - 在 C++ 中检查打开的 UDP 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10886228/

相关文章:

c++ - 构建 boost 错误 : Name clash for '<pstage\lib>boost_system-vc120-mt-1_58.dll'

c++ - 如何在 C++ 中找到最大/最小值的值和索引

python - 如何以编程方式在 Linux 中查找网络使用情况

jenkins - Docker-Compose - 随机网络名称

udp - 保护 UDP 连接的安全

c++ - 如何使用子类上重载的相同方法使工作可变参数方法继承

linux - 使用 GNU/Linux 系统调用 `splice` 在 Haskell 中进行零拷贝套接字到套接字数据传输

c++ - 如何增加 UDP 的最大数据包大小?

c - 通过 UDP 发送时丢失数据

c++ - 从基类访问 union 的公共(public)部分