5

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

平台是Linux。

4

2 回答 2

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即使应用程序不仅在侦听,而且还在主动向您发送数据,您也可以得到。(这种情况很少见,但我见过。)

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

底线:不,不是真的。

于 2012-06-04T19:05:59.017 回答
0

没有万无一失的方法可以检查远程端口是否准备好接收您的 UDP 数据报。由于 UDP 是无连接的,因此您可以判断远程主机是否正在回答对您有意义的内容。可能有一些方法可以获得提示(就像端口扫描仪所做的那样),但这不是我在生产代码中所依赖的。

于 2012-06-04T18:54:17.873 回答