国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

手把手教你用Go語言打造一款簡易TCP端口掃描器

開發 前端
這次呢, 咱們來實現一個簡單的TCP端口掃描器!

[[374779]]

 前言

Hey,大家好呀,我是碼農,星期八。

這次呢, 咱們來實現一個簡單的TCP端口掃描器!

也來體驗一下黑客的風采!

TCP掃描本質

我們在使用TCP進行連接時,需要知道對方機器的ip:port

正常握手

連接成功的話,流程如下。


連接失敗

有正常,就有失敗,如果被連接方關閉的話,流程如下。


如果有防火墻

還有一種可能是,端口開放,但是防火墻攔截,流程如下。


代碼

本質理解之后,就可以開始擼代碼了。

在Go中,我們通常使用net.Dial進行TCP連接

它就兩種情況

  • 成功:返回conn。
  • 失敗:err != nil。

普通版

相對來說,剛開始時,我們可能都不是太膽大,都是先寫原型,也不考慮性能。

代碼

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "net" 
  6.  
  7. func main() { 
  8.     var ip = "192.168.43.34" 
  9.     for i := 21; i <= 120; i++ { 
  10.         var address = fmt.Sprintf("%s:%d", ip, i) 
  11.         conn, err := net.Dial("tcp", address) 
  12.         if err != nil { 
  13.             fmt.Println(address, "是關閉的"
  14.             continue 
  15.         } 
  16.         conn.Close() 
  17.         fmt.Println(address, "打開"
  18.   } 

執行結果


但是這個過程是非常緩慢的。

因為net.Dial如果連接的是未開放的端口,一個端口可能就是20s+,所以,我們為什么學習多線程懂了把!!!

多線程版

上述是通過循環去一個個連接ip:port的,那我們就知道了,在一個個連接的位置,讓多個人去干就好了。

所以,多線程如下。

代碼

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "net" 
  6.     "sync" 
  7.     "time" 
  8.  
  9. func main() { 
  10.  
  11.     var begin =time.Now() 
  12.     //wg 
  13.     var wg sync.WaitGroup 
  14.     //ip 
  15.     var ip = "192.168.99.112" 
  16.     //var ip = "192.168.43.34" 
  17.     //循環 
  18.     for j := 21; j <= 65535; j++ { 
  19.         //添加wg 
  20.         wg.Add(1) 
  21.         go func(i int) { 
  22.             //釋放wg 
  23.             defer wg.Done() 
  24.             var address = fmt.Sprintf("%s:%d", ip, i) 
  25.             //conn, err := net.DialTimeout("tcp", address, time.Second*10) 
  26.             conn, err := net.Dial("tcp", address) 
  27.             if err != nil { 
  28.                 //fmt.Println(address, "是關閉的", err) 
  29.                 return 
  30.             } 
  31.             conn.Close() 
  32.             fmt.Println(address, "打開"
  33.         }(j) 
  34.     //等待wg 
  35.     wg.Wait() 
  36.     var elapseTime = time.Now().Sub(begin
  37.     fmt.Println("耗時:", elapseTime) 

執行結果

 

其實是同時開啟了6W多個線程,去掃描每個ip:port。

所以耗時最長的線程結束的時間,就是程序結束的時間。

感覺還行,20s+掃描完6w多個端口!!!

線程池版

上面我們簡單粗暴的方式為每個ip:port都創建了一個協程。

雖然在Go中,理論上協程開個幾十萬個都沒問題,但是還是有一些壓力的。

所以我們應該采用一種相對節約的方式進行精簡代碼,一般采用線程池方式。

本次使用的線程池包:gohive

地址:https://github.com/loveleshsharma/gohive

簡單介紹


代碼

  1. package main 
  2.  
  3. //線程池方式 
  4. import ( 
  5.     "fmt" 
  6.     "github.com/loveleshsharma/gohive" 
  7.     "net" 
  8.     "sync" 
  9.     "time" 
  10.  
  11. //wg 
  12. var wg sync.WaitGroup 
  13.  
  14. //地址管道,100容量 
  15. var addressChan = make(chan string, 100) 
  16.  
  17. //工人 
  18. func worker() { 
  19.     //函數結束釋放連接 
  20.     defer wg.Done() 
  21.     for { 
  22.         address, ok := <-addressChan 
  23.         if !ok { 
  24.             break 
  25.         } 
  26.         //fmt.Println("address:", address) 
  27.         conn, err := net.Dial("tcp", address) 
  28.         //conn, err := net.DialTimeout("tcp", address, 10) 
  29.         if err != nil { 
  30.             //fmt.Println("close:", address, err) 
  31.             continue 
  32.         } 
  33.         conn.Close() 
  34.         fmt.Println("open:", address) 
  35. func main() { 
  36.     var begin = time.Now() 
  37.     //ip 
  38.     var ip = "192.168.99.112" 
  39.     //線程池大小 
  40.     var pool_size = 70000 
  41.     var pool = gohive.NewFixedSizePool(pool_size) 
  42.  
  43.     //拼接ip:端口 
  44.     //啟動一個線程,用于生成ip:port,并且存放到地址管道種 
  45.     go func() { 
  46.         for port := 1; port <= 65535; port++ { 
  47.             var address = fmt.Sprintf("%s:%d", ip, port) 
  48.             //將address添加到地址管道 
  49.             //fmt.Println("<-:",address) 
  50.             addressChan <- address 
  51.         } 
  52.         //發送完關閉 addressChan 管道 
  53.         close(addressChan) 
  54. }() 
  55.     //啟動pool_size工人,處理addressChan種的每個地址 
  56.     for work := 0; work < pool_size; work++ { 
  57.         wg.Add(1) 
  58.         pool.Submit(worker) 
  59.     //等待結束 
  60.     wg.Wait() 
  61.     //計算時間 
  62.     var elapseTime = time.Now().Sub(begin
  63.     fmt.Println("耗時:", elapseTime) 

執行結果


我設置的線程池大小是7w個,所以也是一下子開啟6w多個協程的,但是我們已經可以進行線程大小約束了。

假設現在有這樣的去求,有100個ip,需要掃描每個ip開放的端口,如果采用簡單粗暴開線程的方式.

那就是100+65535=6552300,600多w個線程,還是比較消耗內存的,可能系統就會崩潰,如果采用線程池方式。

將線程池控制在50w個,或許情況就會好很多。

但是有一點的是,在Go中,線程池通常需要配合chan使用,可能需要不錯的基礎。

總結

本篇更偏向于樂趣篇,了解一下好玩的玩意。

其實還可以通過net.DialTimeout連接ip:port,這個可以設置超時時間,比如超時5s就判定端口未開放。

此處就不做舉例了。

咱們主要使用三種方式來實現功能。

  • 正常版,沒有并發,速度很慢。
  • 多協程版,并發,性能很高,但是協程太多可能會崩潰。
  • 協程池版,并發,性能高,協程數量可控。

通常情況下,如果基礎可以,更推薦使用協程池方式。

用微笑告訴別人,今天的我比昨天強,今后也一樣。

 

責任編輯:姜華 來源: Go語言進階學習
相關推薦

2021-01-21 06:04:55

Go語言TCP目錄生成器

2024-01-07 20:00:27

2023-05-22 10:04:24

2021-02-01 08:41:06

Java考試系統

2021-02-04 15:52:46

Java考試系統

2017-09-14 09:09:04

php應用LibreOfficeWord轉HTML

2021-01-04 09:55:26

Java移動互聯網

2021-01-05 09:04:20

Javatxt文件

2022-02-17 10:26:17

JavaScript掃雷游戲前端

2021-12-30 08:56:57

Python摸魚倒計界面Python基礎

2021-11-01 10:26:07

CanvasAPI畫布技術HTML5

2021-08-13 09:01:31

Python小游戲Python基礎

2022-01-24 11:02:27

PySimpleGUPython計算器

2021-08-09 13:31:25

PythonExcel代碼

2022-10-19 14:30:59

2021-02-04 09:00:57

SQLDjango原生

2021-02-06 14:55:05

大數據pandas數據分析

2011-03-28 16:14:38

jQuery

2022-08-04 10:39:23

Jenkins集成CD

2022-06-30 16:10:26

Python計時器裝飾器
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三区四区久久| 亚洲a成v人在线观看| 精品少妇在线视频| 日韩电影免费| 成人午夜精品在线| 国产精品久久久久久影视| 中文在线8资源库| 亚洲专区免费| 欧美综合在线观看| 日韩高清中文字幕一区二区| 一本色道久久综合亚洲精品按摩| 欧美影院久久久| bl视频在线免费观看| 亚洲成人动漫在线观看| 无码人妻丰满熟妇区毛片18| 免费成人在线观看视频| 国产精品 日韩| 欧美性videos| 亚洲精品欧美二区三区中文字幕| 91精品国产成人www| 成人亚洲视频在线观看| 91丨九色丨国产在线| 中国一级大黄大黄大色毛片| 在线黄色网页| 秋霞电影网一区二区| 国产免费观看久久黄| 精品综合久久88少妇激情| 国产亚洲精品日韩| 久久精品99国产| 韩国成人在线视频| 最新国产成人av网站网址麻豆| 求av网址在线观看| 激情亚洲一区二区三区四区| 精品伦精品一区二区三区视频| 久久夜色电影| 久久69精品久久久久久国产越南| 三上悠亚激情av一区二区三区| 久久97久久97精品免视看| 97国产精东麻豆人妻电影| 国产老肥熟一区二区三区| 亚洲欧美一区二区三区久久| 成人午夜视频免费观看| 国产亚洲毛片| 日韩最新av在线| 电影亚洲精品噜噜在线观看| 亚洲第一页自拍| 性欧美又大又长又硬| 精品国产免费一区二区三区| 久久久久国产视频| а_天堂中文在线| 日韩精品一区二区三区在线播放| 免费超碰在线| 7777女厕盗摄久久久| 宅男噜噜99国产精品观看免费| 国产95亚洲| 久久九九免费视频| 黄页网站视频在线观看| 麻豆91精品| 欧洲精品一区色| 九九国产精品视频| 水蜜桃色314在线观看| 亚洲精品无吗| 国产97人人超碰caoprom| 欧美影院三区| 98国产高清一区| 丝袜诱惑亚洲看片| 亚洲一区二区在线看| 国产乱子伦视频一区二区三区| 亚洲理论电影在线观看| 久久精品亚洲麻豆av一区二区| 国产乱真实合集| 色嗨嗨av一区二区三区| 黄色精品免费看| 中文字幕日韩精品在线观看| 久久成人福利| 国产99在线免费| 国产精品亚洲午夜一区二区三区 | 欧美精品一区二区三区四区| 激情综合在线观看| 中文字幕乱码久久午夜不卡| 最新91在线| 精品国产乱码久久久久久影片| 亚洲成人a级片| 国产精品扒开腿做爽爽爽男男| 国内在线免费视频| 北条麻妃久久精品| 日韩在线观看| 亚洲欧洲精品一区二区| 日韩av二区| 欧美大陆一区二区| 成人99免费视频| 翔田千里在线视频| 国产香蕉一区二区三区在线视频 | 91国产在线精品| 精品动漫一区| 欧美中文在线观看国产| 一本色道久久精品| 国产精品-区区久久久狼| 狠狠久久五月精品中文字幕| 国产丝袜在线观看视频| 国产91精品久久久久| 日韩精品成人一区二区三区| www成人免费视频| 日韩一区二区三区电影在线观看 | 国产午夜精品一区二区三区欧美| 黄色片久久久久| 91精品中文字幕一区二区三区| 高清不卡一区| 久久99精品久久久久子伦| 色偷偷综合网| 成人免费毛片在线观看| 欧美美女bb生活片| 福利在线观看| 精品久久久久久| 欧美理论影院| 国产日韩一区二区三区| 欧美1区免费| 久久无码高潮喷水| 91精品国产一区二区三区蜜臀| 日韩大尺度在线观看| 男女h黄动漫啪啪无遮挡软件| 精品久久久久久亚洲国产300| 国产日韩中文在线中文字幕| 亚洲欧美在线网| 欧美午夜www高清视频| 国产精品白丝av嫩草影院| 在线码字幕一区| 欧美美女黄视频| 亚洲午夜精品一区 二区 三区| 国产精品揄拍500视频| www激情久久| 成人在线黄色电影| 操人视频欧美| 亚洲综合一区在线| 写真福利理论片在线播放| 久久久久www| 国产中文一区二区三区| 麻豆视频在线免费观看| 国产在线观看精品| 影音先锋久久资源网| 国产三级视频| 亚洲精品视频自拍| 亚洲小说区图片区情欲小说| 俺也去精品视频在线观看| 日本不卡不码高清免费观看 | 久久国产三级精品| 精品一区二区成人免费视频| 欧美日韩视频在线第一区| 日韩av自拍| 成人黄色免费| 久久久久久久亚洲精品| 国产jizzjizz一区二区| 国产午夜伦鲁鲁| 亚洲精品国产拍免费91在线| 亚洲国产精品一区制服丝袜| 国产精品久久久久久久龚玥菲| 成人午夜在线影院| 欧美一级一区| 国产视频第一页在线观看| 亚洲a中文字幕| 色综合激情久久| 欧美黄色aaaa| 黄色网页在线播放| 日韩av电影免费在线观看| 日韩欧美不卡一区| 黑人精品欧美一区二区蜜桃| 制服诱惑亚洲| 不卡影院一区二区| 668精品在线视频| 一区二区三区在线观看欧美| 凹凸成人精品亚洲精品密奴| 嫩草在线播放| 日韩理论片在线观看| 亚洲免费一在线| 99精品国产91久久久久久| 97在线影院| 欧美成人女星排名| 久久久久久久欧美精品| 韩日毛片在线观看| 91黄色在线看| 久久久久久久av| 亚洲一区影音先锋| 9i看片成人免费高清| 欧洲永久精品大片ww免费漫画| 18欧美乱大交hd1984| 成人羞羞网站入口| 97在线观看免费观看高清| 日韩在线观看电影完整版高清免费| 日韩av在线影院| 国产精品久久天天影视| 国产69精品久久app免费版| 久久国产手机看片| 在线看欧美日韩| 亚洲人成久久| 激情图片在线观看高清国产| 久久亚洲中文字幕无码| 国产精品久久久久久中文字| 日韩欧美一区二区三区在线| 成人动漫av在线| 久久久久久影院|