对端口进行扫描基于连接,在go
中我们可以使用net.Dial
进行判断,如果返回的结果没有错误,那么这个端口就应该是打开的,如果返回了错误,那么可以说明这个端口是关闭的,代码如下
func ScanPort(protocol string, hostname string, port int) bool {
fmt.Printf("scanning port %d \n", port)
p := strconv.Itoa(port)
addr := net.JoinHostPort(hostname, p)
conn, err := net.DialTimeout(protocol, addr, 3*time.Second)
if err != nil {
return false
}
defer conn.Close()
return true
}
掌握了如何对一个特定的端口进行判断,那么对所有的端口(端口号一共可能有1<<16
个)进行遍历,然后一一进行判断,便可以找到所有的开放端口,但是如果是顺序进行扫描,效率并不是很高,可以使用多协程,见代码 GitHub