Scala中的端口扫描:应用程序挂起,用于远程主机上的关闭端口

Che*_*sin 2 java port scala

我一直在尝试创建一个需要尽快扫描网络(主要是LAN)上的开放端口的应用程序.

我搜索了一下,我找到的一个很好的方法使用以下代码:

(1 to 65536).par.map { case port ?
  try {
    val socket = new java.net.Socket("127.0.0.1", port)
    socket.close()
    println(port)
    port
  } catch {
    case _: Throwable ? -1
  }
}.toSet
Run Code Online (Sandbox Code Playgroud)

但是,代码的问题是,如果我输入127.0.0.1以外的任何内容或localhost作为位置(比如192.168.1.2),应用程序会冻结.

知道为什么会这样,以及我如何解决它?

PS我也尝试用socket.setSoTimeout(1500)设置套接字超时,但没有变化.

Ash*_*ynd 6

就像是

import scala.concurrent.{Future, Await}
import scala.concurrent.duration._
import scala.util.Try
import scala.concurrent._
import java.util.concurrent.Executors

implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(100)) 

def openPorts(address:String ="127.0.0.1",duration:Duration = 10 seconds, fromPort:Int = 1, toPort:Int = 65536) = {
 val socketTimeout = 200
 val result = Future.traverse(fromPort to toPort ) { port =>
  Future{ Try {
    val socket = new java.net.Socket()
    socket.connect(new java.net.InetSocketAddress(address, port),socketTimeout)
    socket.close()
    port
  } toOption } 
 } 
 Try {Await.result(result, duration)}.toOption.getOrElse(Nil).flatten
}


scala> val localPorts openPorts(fromPort = 10, toPort = 1000)
localPorts: scala.collection.immutable.IndexedSeq[Int] = Vector(22, 631)
scala> val remotePorts = openPorts(fromPort = 10, toPort = 1000, address="192.168.1.20")
remotePorts: scala.collection.immutable.Seq[Int] = List() //we ate the timeout

scala> val remotePorts = openPorts(fromPort = 12000, toPort = 13000, address="91.190.218.61", duration=30 seconds)
remotePorts: scala.collection.immutable.Seq[Int] = Vector(12345, 12350)
Run Code Online (Sandbox Code Playgroud)