3 回答

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)
}
}

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())
}

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)
}
- 3 回答
- 0 关注
- 155 浏览
添加回答
举报