如何使用 native C++ 检查远程 UDP 端口是否打开?由于 UDP 是无连接的,因此调用 connect()
没有帮助。我无法尝试绑定(bind)它,因为它不是本地的。 nmap
也不能指示。 (然而 netstat
可以找到,但我认为它会查看有关打开的端口/文件的内部信息)。无论如何检测它?如果我在网络级别向下一层,是否可以通过 C++ 发送 ICMP 消息来检查端口不可达状态?我的意思是,这会提供足够的端口状态信息吗?
平台是 Linux。
最佳答案
我假设您正在尝试确定远程计算机上的 UDP 端口是否正在通过防火墙和/或是否有应用程序在其上运行。
您无法可靠地确定这一点。最接近的方法是尝试向该地址和端口发送一系列小数据报,间隔大约 1 秒,持续大约 10 秒。
如果没有防火墙阻止端口并且没有应用程序正在运行,则远程系统可能会发回 ICMP_UNREACH_PORT
(端口无法访问)。如果没有阻止防火墙并且远程系统已关闭,路由器可能会发回 ICMP_UNREACH_HOST
或 ICMP_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/