91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go怎么實現簡易端口掃描

發布時間:2021-05-23 11:47:12 來源:億速云 閱讀:294 作者:小新 欄目:開發技術

小編給大家分享一下go怎么實現簡易端口掃描,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

我在代碼里定義了兩個通道,分別用于生產端口和限制連接數,如果不限制連接數,容易被對方檢測到或導致對方服務器不能正常運行。

// 生產端口
var port = make(chan int, 10)

// 限制并發數
var connect = make(chan string, 5)

可以使用net庫的Dial函數做為socket客戶端,需要注意的是要設置超時時間,因為若主機不存在,或目標端口是關閉的,往往需要花費數秒才返回錯誤,這樣掃描大量端口時效率會極其低下。在go中可以使用net.Dialer結構體設置超時時間,然后在調用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("請輸入結束端口:> ")
  fmt.Scan(&end)
  wg.Add(end - start + 1)
  Run(address, start, end)
  wg.Wait()
  fmt.Println("執行完畢")
}


// 生產端口
var port = make(chan int, 10)

// 限制并發數
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 {
      // 往通道寫入目標地址,超過限制并發數會阻塞
      connect <- fmt.Sprintf("%s:%d", address, p)
    }
  }()

  go Connect()


}

func Connect() {
  // 并發請求
  for target := range connect {
    // 設置超時時間
    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()
  }
}

這里端口生產通道不是必須的,只是為了演示消費生產并發模型,當然這還是最簡單的。
在Run函數里我沒有關閉這兩個通道,按官方的說法是gc會回收不使用的通道,如果要手動關閉,可以定義defer閉包進行close。
我本地運行結果如下:

請輸入目標IP:> 127.0.0.1
請輸入起始端口:> 8080
請輸入結束端口:> 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 連接失敗
執行完畢

這個版本比較簡陋,TCP連接過程也可以簡化,后續再寫另外一篇文章。因為最近在學rust語言,語法內容比較多,所以后面暫時發布編程相關的文章,提升一下語法熟練度。

go適合做什么

go是golang的簡稱,而golang可以做服務器端開發,且golang很適合做日志處理、數據打包、虛擬機處理、數據庫代理等工作。在網絡編程方面,它還廣泛應用于web應用、API應用等領域。

以上是“go怎么實現簡易端口掃描”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

鹿邑县| 阳江市| 南昌县| 神农架林区| 崇信县| 班戈县| 余姚市| 六盘水市| 盘山县| 南京市| 福海县| 汝城县| 郴州市| 山丹县| 大洼县| 昌邑市| 财经| 潍坊市| 临湘市| 湛江市| 昭苏县| 阿瓦提县| 五大连池市| 正安县| 井陉县| 凉山| 柏乡县| 大厂| 托克逊县| 台东县| 宜良县| 东兴市| 郎溪县| 固安县| 乃东县| 淮滨县| 全南县| 桓仁| 龙州县| 广德县| 碌曲县|