给定一个网络接口(inet_x), erlang中是否有一种本地方法来识别该接口上的所有侦听端口?
可以实现一个网络扫描函数,扫描这样一个网络接口的ip地址,从端口a到B (scanner:scan(IpToScan, StartPort, EndPOrt)),但它是相当慢的实现这些结果。
是否有更快/更原生的方法来实现这一点?我特别感兴趣的是获得一个显示类似于shell命令的结果的列表。该结果的重要方面还在于端口表明它是如何侦听的,例如(*)表示所有DNS/ip-address
netstat - a | grep LISTEN
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的操作系统结果很容易,但不是跨平台的。
我的理解是,netstat用于在内核网络数据结构上提供一个友好的、可查询的界面,因此,所有显示的信息都将来自本地计算机,而不是远程计算机。nmap
,如果我正确地将您的请求理解为需要远程计算机的信息,则与scanner:scan/3
更内联。我对它的内部细节不太清楚,但是在nmap
使用ICMP的地方,您可以模仿gen_icmp
或更普遍地使用procket。
也就是说,如果您有一个简单的scanner:scan/3
实现,但发现它太慢,您是否考虑并行运行一个或所有扫描ping ?并行映射实现可能会达到这个目的,或者您可以使用OTP和单个请求者进程/多个工作进程模型,其中每个工作进程执行缓慢的ping,并在完成时向请求者进程发送消息。