亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

迭代多行變量以返回所有 ips

迭代多行變量以返回所有 ips

Go
阿晨1998 2022-09-05 10:14:00
我正在嘗試為初學者golang項目構建一個簡單的端口掃描程序,并且大多數代碼都按預期工作,但是我在函數方面遇到了問題,可以返回逐行生成的所有ip并將其傳遞給另一個函數以掃描它們 當前返回第一行只有一種方法可以循環訪問變量以逐行返回所有ips?ipv4_gen()ipv4_gen()ippackage mainimport (    "fmt"    "log"    "net"    "strconv"    "time")func ipv4_gen() string {    ip, ipnet, err := net.ParseCIDR("192.168.1.1/24")    if err != nil {        log.Fatal(err)    }    for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {        return ip.String()    }    return ip.String()}func inc(ip net.IP) {    for j := len(ip) - 1; j >= 0; j-- {        ip[j]++        if ip[j] > 0 {            break        }    }}func port_scanner(host string) {    port := strconv.Itoa(80)    conn, err := net.DialTimeout("tcp", host+":"+port, 1*time.Second)    if err == nil {        fmt.Println("Host:", conn.RemoteAddr().String(), "open")        conn.Close()    }}func main() {    port_scanner(ipv4_gen())}如果要運行代碼,請單擊下面的鏈接 https://play.golang.org/p/YWvgnowZzhI
查看完整描述

3 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

要從函數返回多個結果(尤其是在生成可能生成數千個結果時),在 Go 中使用通道是慣用語。


package main


import (

    "fmt"

    "log"

    "net"

    "strconv"

    "time"

)


func ipv4_gen(out chan string) {

    ip, ipnet, err := net.ParseCIDR("192.168.1.1/24")

    if err != nil {

        log.Fatal(err)

    }

    for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {

        out <- ip.String()

    }

    close(out)

}


func inc(ip net.IP) {

    for j := len(ip) - 1; j >= 0; j-- {

        ip[j]++

        if ip[j] > 0 {

            break

        }

    }

}


func port_scanner(host string) {

    port := strconv.Itoa(80)

    conn, err := net.DialTimeout("tcp", host+":"+port, 1*time.Second)

    if err == nil {

        fmt.Println("Host:", conn.RemoteAddr().String(), "open")

        conn.Close()

    }

}


func main() {

    ips := make(chan string)

    go ipv4_gen(ips)

    for s := range ips {

        port_scanner(s)

    }

}


查看完整回答
反對 回復 2022-09-05
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

雖然通道對于在 goroutine 之間進行通信很有用,但使用 goroutines 將地址迭代與掃描分開并不會讓您受益。頻道減慢了速度。更簡單、更快捷的解決方案是使用迭代器對象。任何語言的迭代器對象都旨在完全按照您的請求執行操作,以“迭代ip變量以返回所有ip”。


下面是使用 IPAddress Go 庫執行此操作的代碼。免責聲明:我是項目經理。


package main


import (

    "fmt"

    "github.com/seancfoley/ipaddress-go/ipaddr"

    "net"

    "time"

)


func ipv4_gen() ipaddr.IPAddressIterator {

    block := ipaddr.NewIPAddressString("192.168.1.0/24").GetAddress()

    iterator := block.WithoutPrefixLen().Iterator()

    iterator.Next() // skip the first address 192.168.1.0

    return iterator

}


func port_scanner(iterator ipaddr.IPAddressIterator) {

    for iterator.HasNext() {

        conn, err := net.DialTimeout("tcp", 

            fmt.Sprint(iterator.Next(), ":", 80), time.Second)

        if err == nil {

            fmt.Println("Host:", conn.RemoteAddr().String(), "open")

            conn.Close()

        }

    }

}


func main() {

    port_scanner(ipv4_gen())

}


查看完整回答
反對 回復 2022-09-05
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

如果我正確地理解了你的問題,那么這應該有效。


package main


import (

    "fmt"

    "log"

    "net"

    "os"

    "strconv"

    "time"

)


func ipv4_gen(ch chan<- string) {

    ip, ipnet, err := net.ParseCIDR("192.168.1.1/24")

    if err != nil {

        log.Fatal(err)

    }

    for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {

        ch <- ip.String()

    }

    close(ch)

}


func inc(ip net.IP) {

    for j := len(ip) - 1; j >= 0; j-- {

        if ip[j]++; ip[j] > 0 {

            break

        }

    }

}


func port_scanner(hosts <-chan string) {

    for host := range hosts {

        port := strconv.Itoa(80)

        conn, err := net.DialTimeout("tcp", host+":"+port, 1*time.Second)

        if err != nil {

            fmt.Fprintln(os.Stderr, err)

            continue

        }

        fmt.Println("Host:", conn.RemoteAddr().String(), "open")

        conn.Close()

    }

}


func main() {

    ip := make(chan string)

    go ipv4_gen(ip)

    port_scanner(ip)

}


查看完整回答
反對 回復 2022-09-05
  • 3 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號