检查打开UDP端口的C ++(Checking open UDP Port in C++)

2019-06-25 04:52发布

如何检查如果远程UDP端口是通过使用本地C ++开放? 由于UDP是无连接的,调用connect()是没有帮助的。 我不能尝试结合它,因为它是不是本地的。 nmap不能也表示。 (但是netstat可以找到,但我认为它看起来约开放的端口/文件内部信息)。 反正是有检测吗? 如果我去一个层下来的网络水平,是有可能通过C ++来发送一个ICMP报文检查端口不可达的状态? 我的意思是,是否会给出端口状态足够的信息?

平台是Linux操作系统。

Answer 1:

我假设你正在试图确定是否在远程机器上的UDP端口正在通过防火墙传递和/或具有在其上运行的应用程序。

你不能可靠地确定这一点。 你能来最接近的是尝试发送一系列小的报文到地址和端口号,间隔约1秒间隔约10秒。

如果没有防火墙阻塞端口,并没有应用程序正在运行,则远程系统会发送回ICMP_UNREACH_PORT (端口不可达)。 如果没有阻止防火墙和远程系统停机,路由器可以发送回ICMP_UNREACH_HOSTICMP_UNREACH_NET 。 如果防火墙阻止你,它可能会发送回ICMP_UNREACH_FILTER_PROHIB ,但大多数防火墙不发回任何东西。

得到任何这些回的可能性相当渺茫,因为大多数防火墙阻止某种ICMP反馈。 即使ICMP消息也回来了,LINUX一般不会让你看到它,除非你以root身份运行。 一些操作系统会为下一个故障报告ICMP错误sendto()到相同的地址/端口,这就是为什么你需要重复的消息几次。 但是,有些则没有,在这种情况下,你必须打开一个特定的ICMP端口和分析任何返回消息。

即使你以某种方式得到一个ICMP消息,了解到他们是不可靠的。 例如,你可以得到ICMP_UNREACH_PORT即使一个应用程序,不仅听,而是积极地向您发送数据。 (这是罕见的,但我已经看到了这一点。)

如果应用程序是在给定的端口上,如果运行你知道应用是什么,如果你知道如何制作的消息,这将导致该应用程序向您做出答复,那么这样做,并得到一个回应是,该端口的最佳适应证开了。 但是,没有得到响应意味着什么:也许端口被阻塞,也许不运行应用程序,或者也许它只是不喜欢你的信息。

底线:没有,真的没有。



Answer 2:

还有就是要检查一个远程端口已准备好接收您的UDP数据报没有防弹方式。 由于UDP是无连接的,你可以只告诉我们,如果远程主机的东西回答对你有意义的。 有很多方法可以得到一个提示(如端口扫描器做),但什么我将依靠在生产代码。



文章来源: Checking open UDP Port in C++