第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在這種情況下如何正確循環(huán)緩沖通道?

在這種情況下如何正確循環(huán)緩沖通道?

Go
人到中年有點(diǎn)甜 2021-10-25 16:19:50
我正在嘗試使用標(biāo)準(zhǔn)庫來制作某種端口掃描器。這更像是一個練習(xí),所以請不要評論所涉及的邏輯。查看以下代碼:package mainimport (    "flag"    "fmt"    "net"    "time"    "strings"    "strconv"    "log"    "sync")var commonPorts = map[int]string {    21: "ftp",    22: "sftp",    80: "http",    110: "pop3",    143: "imap",    443: "https",    631: "ipp",    993: "imaps",    995: "pop3s",}type OP struct {    mu sync.Mutex    ports []string}func (o *OP) SafeAdd(port string) {    o.mu.Lock()    defer o.mu.Unlock()    o.ports = append(o.ports, port)}func worker(host string, port int) string {    address := fmt.Sprintf("%s:%d", host, port)    conn, err := net.DialTimeout("tcp", address, time.Second * 3)    if err != nil {        return ""; // is offline, cannot connect    }    conn.Close()    stringI := strconv.Itoa(port)    if name, ok := commonPorts[port]; ok {        stringI += fmt.Sprintf("(%s)", name)    }    return stringI}有兩種開始掃描的方法,一種是使用緩沖通道,另一種是使用 sync.GroupWait 并在所有掃描完成后退出。在我看來,在這種情況下,使用 sync.GroupWait 比使用緩沖通道并循環(huán)遍歷它直到它為空更有意義。然而,在這里使用緩沖通道,我沒有看到一種方法來檢測通道上沒有其他東西,我應(yīng)該從 for 循環(huán)中退出,除非使用另一個 sync.WaitGroup 塊。我想我的問題是,如果我只想使用緩沖通道解決方案,我如何正確實(shí)現(xiàn)它,以便我知道處理何時完成,以便我可以繼續(xù)執(zhí)行其余代碼?(請不要建議超時)。這也是這兩種類型的一個小基準(zhǔn),以防有人感興趣:MacBook-Pro:PortScanner c$ time ./PortScanner -host yahoo.com -type 1Scanning: yahoo.com...Following ports are opened: 80(http), 143(imap), 110(pop3), 995(pop3s), 993(imaps)real    0m4.620suser    0m1.193ssys     0m1.284sMacBook-Pro:PortScanner c$ time ./PortScanner -host yahoo.com -type 2Scanning: yahoo.com...Following ports are opened: 110(pop3), 80(http), 143(imap), 995(pop3s), 993(imaps)real    0m4.055suser    0m1.051ssys     0m0.946s
查看完整描述

1 回答

?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊

processWithChannels如果您需要將超過 1000 個項(xiàng)目放入頻道,則調(diào)用將掛起。如果您打算使用緩沖通道來保存所有值直到處理,則必須有足夠的容量來接受所有值。


如果您要將所有值收集到一個切片中,則沒有理由使用通道,您的第二個解決方案就很好。


如果您想盡快“流”回端口,那么您需要介于兩種解決方案之間


ports := make(chan string)


var wg sync.WaitGroup

for i := 1; i <= 65535; i++ {

    wg.Add(1)

    go func(i int) {

        defer wg.Done()

        if port := worker(*host, i); port != "" {

            ports <- port

        }

    }(i)

}


go func() {

    wg.Wait()

    close(ports)

}()


for port := range ports {

    fmt.Println("PORT:", port)

}

然而,這很可能會遇到問題,例如當(dāng)您同時撥打所有 65535 端口時丟失開放端口。這是使用一組工作人員同時撥號的一種可能模式:


ports := make(chan string)

toScan := make(chan int)

var wg sync.WaitGroup


// make 100 workers for dialing

for i := 0; i < 100; i++ {

    wg.Add(1)

    go func() {

        defer wg.Done()

        for p := range toScan {

            ports <- worker(*host, p)

        }

    }()

}


// close our receiving ports channel once all workers are done

go func() {

    wg.Wait()

    close(ports)

}()


// feed the ports to the worker pool

go func() {

    for i := 1; i <= 65535; i++ {

        toScan <- i

    }

    // signal the workers to stop

    close(toScan)

}()


for port := range ports {

    if port != "" {

        fmt.Println("PORT:", port)

    }

}


查看完整回答
反對 回復(fù) 2021-10-25
  • 1 回答
  • 0 關(guān)注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號