您好,登錄后才能下訂單哦!
小編給大家分享一下go怎么實現(xiàn)簡易端口掃描,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我在代碼里定義了兩個通道,分別用于生產(chǎn)端口和限制連接數(shù),如果不限制連接數(shù),容易被對方檢測到或?qū)е聦Ψ?a title="服務器" target="_blank" href="http://kemok4.com/">服務器不能正常運行。
// 生產(chǎn)端口 var port = make(chan int, 10) // 限制并發(fā)數(shù) var connect = make(chan string, 5)
可以使用net庫的Dial函數(shù)做為socket客戶端,需要注意的是要設(shè)置超時時間,因為若主機不存在,或目標端口是關(guān)閉的,往往需要花費數(shù)秒才返回錯誤,這樣掃描大量端口時效率會極其低下。在go中可以使用net.Dialer結(jié)構(gòu)體設(shè)置超時時間,然后在調(diào)用Dial方法:
d := net.Dialer{Timeout: time.Second} dial, err := d.Dial("tcp", target)
只要err不等于nil,表示目標端口是對外開放的。
完整代碼如下:
package main import ( "fmt" "net" "sync" "time" ) var wg sync.WaitGroup func main() { var start, end int var address string fmt.Printf("請輸入目標IP:> ") fmt.Scan(&address) fmt.Printf("請輸入起始端口:> ") fmt.Scan(&start) fmt.Printf("請輸入結(jié)束端口:> ") fmt.Scan(&end) wg.Add(end - start + 1) Run(address, start, end) wg.Wait() fmt.Println("執(zhí)行完畢") } // 生產(chǎn)端口 var port = make(chan int, 10) // 限制并發(fā)數(shù) var connect = make(chan string, 5) func Run(address string, start, end int) { go func() { for i := start; i <= end; i++ { port <- i } }() go func() { // 消費端口 for p := range port { // 往通道寫入目標地址,超過限制并發(fā)數(shù)會阻塞 connect <- fmt.Sprintf("%s:%d", address, p) } }() go Connect() } func Connect() { // 并發(fā)請求 for target := range connect { // 設(shè)置超時時間 d := net.Dialer{Timeout: time.Second} dial, err := d.Dial("tcp", target) if err == nil { fmt.Printf("%s 連接成功\n", target) dial.Close() }else{ fmt.Printf("%s 連接失敗\n", target) } wg.Done() } }
這里端口生產(chǎn)通道不是必須的,只是為了演示消費生產(chǎn)并發(fā)模型,當然這還是最簡單的。
在Run函數(shù)里我沒有關(guān)閉這兩個通道,按官方的說法是gc會回收不使用的通道,如果要手動關(guān)閉,可以定義defer閉包進行close。
我本地運行結(jié)果如下:
請輸入目標IP:> 127.0.0.1 請輸入起始端口:> 8080 請輸入結(jié)束端口:> 8094 127.0.0.1:8080 連接成功 127.0.0.1:8081 連接成功 127.0.0.1:8082 連接成功 127.0.0.1:8083 連接成功 127.0.0.1:8084 連接成功 127.0.0.1:8085 連接成功 127.0.0.1:8086 連接成功 127.0.0.1:8087 連接成功 127.0.0.1:8088 連接成功 127.0.0.1:8089 連接成功 127.0.0.1:8090 連接成功 127.0.0.1:8091 連接成功 127.0.0.1:8092 連接成功 127.0.0.1:8093 連接失敗 127.0.0.1:8094 連接失敗 執(zhí)行完畢
這個版本比較簡陋,TCP連接過程也可以簡化,后續(xù)再寫另外一篇文章。因為最近在學rust語言,語法內(nèi)容比較多,所以后面暫時發(fā)布編程相關(guān)的文章,提升一下語法熟練度。
go是golang的簡稱,而golang可以做服務器端開發(fā),且golang很適合做日志處理、數(shù)據(jù)打包、虛擬機處理、數(shù)據(jù)庫代理等工作。在網(wǎng)絡編程方面,它還廣泛應用于web應用、API應用等領(lǐng)域。
以上是“go怎么實現(xiàn)簡易端口掃描”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。