最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLand編寫(xiě) TCP 端口掃描器的詳細(xì)過(guò)程

 更新時(shí)間:2023年05月09日 10:42:05   作者:QIAOPENGJUN  
TCP,也就是傳輸控制協(xié)議(Transmission Control Protocol),這篇文章主要介紹了Go語(yǔ)言(Golang)編寫(xiě) TCP 端口掃描器,需要的朋友可以參考下

Go 語(yǔ)言編寫(xiě) TCP 掃描器

TCP

  • TCP,也就是傳輸控制協(xié)議(Transmission Control Protocol)。

TCP握手

  • 建立 TCP連接(或者叫打開(kāi)端口),需要3次握手

客戶端 -> 端口打開(kāi) ->服務(wù)器

  • syn (請(qǐng)求建立新連接)
  • syn-ack (同意創(chuàng)建新連接)
  • ack (表示響應(yīng))
  • 服務(wù)端端口關(guān)閉 Closed Port
    • client -syn-> Server
    • Server -rst-> Client
  • 如果存在防火墻 Filtered Port
    • Client —syn (Timeout)— Firewall Server

非并發(fā)的 TCP 掃描器

創(chuàng)建目錄并在該目錄創(chuàng)建main.go 文件

~/Code/go via ?? v1.20.3 via ?? base
? mcd tcp-scanner
Code/go/tcp-scanner via ?? v1.20.3 via ?? base
? go mod init
go: cannot determine module path for source directory /Users/qiaopengjun/Code/go/tcp-scanner (outside GOPATH, module path must be specified)
Example usage:
	'go mod init example.com/m' to initialize a v0 or v1 module
	'go mod init example.com/m/v2' to initialize a v2 module
Run 'go help mod init' for more information.
Code/go/tcp-scanner via ?? v1.20.3 via ?? base
? go mod init tcp-scanner
go: creating new go.mod: module tcp-scanner
Code/go/tcp-scanner via ?? v1.20.3 via ?? base
? c
Code/go/tcp-scanner via ?? v1.20.3 via ?? base
?

main.go 文件

package main
import (
	"fmt"
	"net"
)
func main() {
	for i := 21; i < 120; i++ {
		address := fmt.Sprintf("20.194.168.28:%d", i)
		conn, err := net.Dial("tcp", address)
		if err != nil {
			fmt.Printf("%s failed 關(guān)閉了\n", address)
			continue
		}
		conn.Close()
		fmt.Printf("%s connected 打開(kāi)了!??!\n", address)
	}
}

并發(fā)的 TCP 掃描器

package main
import (
	"fmt"
	"net"
	"sync"
	"time"
)
func main() {
	start := time.Now()
	var wg sync.WaitGroup
	for i := 21; i < 120; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			address := fmt.Sprintf("20.194.168.28:%d", j)
			conn, err := net.Dial("tcp", address)
			if err != nil {
				fmt.Printf("%s 關(guān)閉了\n", address)
				return
			}
			conn.Close()
			fmt.Printf("%s 打開(kāi)了?。?!\n", address)
		}(i)
	}
	wg.Wait()
	elapsed := time.Since(start) / 1e9
	fmt.Printf("\n\n%d seconds", elapsed)
}
// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 關(guān)閉了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打開(kāi)了!??!\n", address)
// 	}
// }

并發(fā)的 TCP 掃描器 - WORKER 池

package main
import (
	"fmt"
	"sync"
)
func worker(ports chan int, wg *sync.WaitGroup) {
	for p := range ports {
		fmt.Println("p", p)
		wg.Done()
	}
}
func main() {
	ports := make(chan int, 100)
	var wg sync.WaitGroup
	for i := 0; i < cap(ports); i++ {
		go worker(ports, &wg)
	}
	for i := 1; i < 1024; i++ {
		wg.Add(1)
		ports <- i
	}
	wg.Wait()
	close(ports)
}
// func main() {
// 	start := time.Now()
// 	var wg sync.WaitGroup
// 	for i := 21; i < 120; i++ {
// 		wg.Add(1)
// 		go func(j int) {
// 			defer wg.Done()
// 			address := fmt.Sprintf("20.194.168.28:%d", j)
// 			conn, err := net.Dial("tcp", address)
// 			if err != nil {
// 				fmt.Printf("%s 關(guān)閉了\n", address)
// 				return
// 			}
// 			conn.Close()
// 			fmt.Printf("%s 打開(kāi)了!??!\n", address)
// 		}(i)
// 	}
// 	wg.Wait()
// 	elapsed := time.Since(start) / 1e9
// 	fmt.Printf("\n\n%d seconds", elapsed)
// }
// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 關(guān)閉了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打開(kāi)了?。?!\n", address)
// 	}
// }

優(yōu)化之后

package main
import (
	"fmt"
	"net"
	"sort"
)
func worker(ports chan int, results chan int) {
	for p := range ports {
		address := fmt.Sprintf("20.194.168.28:%d", p)
		conn, err := net.Dial("tcp", address)
		if err != nil {
			results <- 0
			continue
		}
		conn.Close()
		results <- p
	}
}
func main() {
	ports := make(chan int, 100)
	results := make(chan int)
	var openports []int
	var closeports []int
	for i := 0; i < cap(ports); i++ {
		go worker(ports, results)
	}
	go func() {
		for i := 1; i < 1024; i++ {
			ports <- i
		}
	}()
	for i := 1; i < 1024; i++ {
		port := <-results
		if port != 0 {
			openports = append(openports, port)
		} else {
			closeports = append(closeports, port)
		}
	}
	close(ports)
	close(results)
	sort.Ints(openports)
	sort.Ints(closeports)
	for _, port := range closeports {
		fmt.Printf("%d closed\n", port)
	}
	for _, port := range openports {
		fmt.Printf("%d opened\n", port)
	}
}
// func main() {
// 	start := time.Now()
// 	var wg sync.WaitGroup
// 	for i := 21; i < 120; i++ {
// 		wg.Add(1)
// 		go func(j int) {
// 			defer wg.Done()
// 			address := fmt.Sprintf("20.194.168.28:%d", j)
// 			conn, err := net.Dial("tcp", address)
// 			if err != nil {
// 				fmt.Printf("%s 關(guān)閉了\n", address)
// 				return
// 			}
// 			conn.Close()
// 			fmt.Printf("%s 打開(kāi)了?。?!\n", address)
// 		}(i)
// 	}
// 	wg.Wait()
// 	elapsed := time.Since(start) / 1e9
// 	fmt.Printf("\n\n%d seconds", elapsed)
// }
// func main() {
// 	for i := 21; i < 120; i++ {
// 		address := fmt.Sprintf("20.194.168.28:%d", i)
// 		conn, err := net.Dial("tcp", address)
// 		if err != nil {
// 			fmt.Printf("%s failed 關(guān)閉了\n", address)
// 			continue
// 		}
// 		conn.Close()
// 		fmt.Printf("%s connected 打開(kāi)了!??!\n", address)
// 	}
// }

到此這篇關(guān)于Go語(yǔ)言(Golang)編寫(xiě) TCP 端口掃描器的文章就介紹到這了,更多相關(guān)Go語(yǔ)言TCP 端口掃描器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO語(yǔ)言的控制語(yǔ)句詳解包括GO語(yǔ)言的指針語(yǔ)法

    GO語(yǔ)言的控制語(yǔ)句詳解包括GO語(yǔ)言的指針語(yǔ)法

    這篇文章主要介紹了GO語(yǔ)言的控制語(yǔ)句詳解包括GO語(yǔ)言的指針語(yǔ)法,GO語(yǔ)言switch結(jié)構(gòu),GO語(yǔ)言for的4種結(jié)構(gòu)需要的朋友可以參考下
    2022-12-12
  • Go語(yǔ)言異常處理error、panic、recover的使用

    Go語(yǔ)言異常處理error、panic、recover的使用

    GO語(yǔ)言中引入的異常的處理方式為error、panic、recover ,本文主要介紹了Go語(yǔ)言異常處理error、panic、recover的使用,感興趣的可以了解一下
    2024-08-08
  • 詳解Go語(yǔ)言中的數(shù)據(jù)類型及類型轉(zhuǎn)換

    詳解Go語(yǔ)言中的數(shù)據(jù)類型及類型轉(zhuǎn)換

    這篇文章主要為大家介紹了Go語(yǔ)言中常見(jiàn)的幾種數(shù)據(jù)類型,以及他們之間的轉(zhuǎn)換方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • go:垃圾回收GC觸發(fā)條件詳解

    go:垃圾回收GC觸發(fā)條件詳解

    這篇文章主要介紹了go:垃圾回收GC觸發(fā)條件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例

    Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例

    這篇文章主要給大家介紹了golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例及演示效果,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考閱讀本文
    2023-08-08
  • docker如何安裝部署golang應(yīng)用程序

    docker如何安裝部署golang應(yīng)用程序

    這篇文章主要為大家介紹了docker如何安裝部署golang應(yīng)用程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Go語(yǔ)言實(shí)現(xiàn)Base64、Base58編碼與解碼

    Go語(yǔ)言實(shí)現(xiàn)Base64、Base58編碼與解碼

    本文主要介紹了Base64、Base58編碼與解碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • go語(yǔ)言中排序sort的使用方法示例

    go語(yǔ)言中排序sort的使用方法示例

    golang中也實(shí)現(xiàn)了排序算法的包sort包,下面這篇文章就來(lái)給大家介紹了關(guān)于go語(yǔ)言中排序sort的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Golang設(shè)計(jì)模式中抽象工廠模式詳細(xì)講解

    Golang設(shè)計(jì)模式中抽象工廠模式詳細(xì)講解

    抽象工廠模式用于生成產(chǎn)品族的工廠,所生成的對(duì)象是有關(guān)聯(lián)的。如果抽象工廠退化成生成的對(duì)象無(wú)關(guān)聯(lián)則成為工廠函數(shù)模式。比如本例子中使用RDB和XML存儲(chǔ)訂單信息,抽象工廠分別能生成相關(guān)的主訂單信息和訂單詳情信息
    2023-01-01

最新評(píng)論

浦东新区| 宁远县| 利津县| 靖西县| 太仆寺旗| 康定县| 遂平县| 永德县| 全椒县| 大英县| 陵川县| 盱眙县| 乐陵市| 宜昌市| 富源县| 银川市| 四平市| 通州区| 新乐市| 台南市| 林州市| 吉隆县| 高台县| 曲水县| 惠州市| 宜黄县| 岳阳县| 武川县| 新平| 西贡区| 离岛区| 梁平县| 华蓥市| 许昌市| 赞皇县| 昭觉县| 电白县| 卢湾区| 丘北县| 正镶白旗| 比如县|