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

时间:2012-06-04 18:25:09

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

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

平台就是Linux。

2 个答案:

答案 0 :(得分:5)

我假设您正在尝试确定远程计算机上的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。 (这很少见,但我看到它发生了。)

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

底线:不,不是真的。

答案 1 :(得分:0)

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