为了账号安全,请及时绑定邮箱和手机立即绑定

迭代多行变量以返回所有 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 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号