2012-06-04 179 views
4

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

平台是Linux。

+0

什么OS /平台上的“本机C++”? – 0xC0000022L

+0

它在Linux平台上 – Mustafa

+0

这里的语言并不像您的代码执行的特权级别那么严重。例如,你可以像'nmap'一样使用C++代码中的'libpcap'库。另外,我认为如果你尝试'nmap'的所有选项,你至少会得到一个关于该端口是否可能打开或被过滤的指示,即使在所有情况下都不能100%确定。使用'netstat'和'nmap'的地方有哪些选项? – 0xC0000022L

回答

4

我假设你正在试图确定是否在远程机器上的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。 (这很少见,但我已经看到它发生了。)

如果应用程序在给定端口上运行,并且您知道该应用程序是什么,并且您知道如何制作消息会导致应用程序响应给你,然后这样做并得到回应是最好的指示,端口是开放的。但是,没有任何回应意味着什么:也许端口被阻止,也许应用程序没有运行,或者它可能只是不喜欢你的消息。底线:不,不是真的。

0

还有就是要检查一个远程端口已准备好接收您的UDP数据报没有防弹方式。由于UDP是无连接的,因此您可以告诉远程主机是否正在回应对您有意义的事情。可能有许多方法可以获得提示(如端口扫描程序所做的那样),但这不是我在生产代码中依赖的东西。