0

给定一个网络接口( inet_x ),erlang 中是否有一种本地方式来识别该接口上的所有侦听端口?

可以实现网络扫描功能,扫描从端口 A 到 B 的此类网络接口的 ip 地址(scanner:scan(IpToScan, StartPort, EndPOrt)),但实现这些结果相当慢。

有没有更快/更原生的方法来实现这一目标?我对获得一个列表特别感兴趣,该列表指示类似于 shell 命令的结果。此结果的重要方面还在于端口指示揭示了它是如何侦听的,例如 (*) 指示所有 DNS/IP 地址

netstat - 一个 | grep 听

tcp4       0      0  *.15672                *.*                    LISTEN   
tcp46      0      0  *.52791                *.*                    LISTEN     
tcp46      0      0  *.8181                 *.*                    LISTEN     
tcp46      0      0  *.http-alt             *.*                    LISTEN     
tcp46      0      0  *.sun-as-jmxrmi        *.*                    LISTEN     
tcp46      0      0  *.websm                *.*                    LISTEN     
tcp46      0      0  *.eforward             *.*                    LISTEN     
tcp46      0      0  *.9095                 *.*                    LISTEN     
tcp4       0      0  *.6379                 *.*                    LISTEN     
tcp6       0      0  localhost.55202        *.*                    LISTEN

另外,虽然os 模块很容易使用,但我想避免它。捕获 netstat -a 的操作系统结果很容易,但不是跨平台的。

4

1 回答 1

0

据我了解,netstat 用于通过内核网络数据结构提供一个友好的、可查询的接口,因此,显示的所有信息都来自本地——从不远程——计算机。nmap,如果我将您的请求正确读取为需要来自远程计算机的信息,则将更符合scanner:scan/3. 我对其内部细节含糊其辞,但是nmap您可以在哪里使用 ICMP 来模仿gen_icmp或更普遍地使用procket 。

也就是说,如果您有一个幼稚的实现scanner:scan/3但发现它太慢,您是否考虑过并行运行一个或所有扫描 ping?并行映射实现可能会解决问题,或者您可以使用 OTP 和单个请求者进程/多个工作进程模型狂奔,其中每个工作人员执行慢 ping,并在完成时向请求者进程发送消息。

于 2013-06-14T07:42:10.750 回答