如何使用本机C ++检查远程UDP端口是否已打开?由于UDP是无连接的,因此调用connect()
没有帮助。我不能尝试绑定它,因为它不是本地的。 nmap
也无法表明。 (但是netstat
可以找到,但我认为它会查看有关开放端口/文件的内部信息)。反正有检测它吗?如果我在网络级别上下层,是否可以通过C ++发送ICMP消息来检查端口不可达状态?我的意思是,这会提供有关港口状况的足够信息吗?
平台就是Linux。
答案 0 :(得分:5)
我假设您正在尝试确定远程计算机上的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
。 (这很少见,但我看到它发生了。)
如果应用程序在给定端口上运行,并且您知道该应用程序是什么,并且您知道如何制作一条消息,这将导致该应用程序响应您,那么这样做并获得响应是最好的指示端口是开放的。但是没有任何回应意味着什么:可能是端口被阻止,也许应用程序没有运行,或者它可能只是不喜欢你的消息。
底线:不,不是真的。
答案 1 :(得分:0)
没有防弹方法可以检查远程端口是否已准备好接收UDP数据报。由于UDP是无连接的,您可以告诉远程主机是否正在回答对您有意义的事情。可能有一些方法可以获得提示(如端口扫描程序那样),但这在生产代码中并不是我所依赖的。