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 關注
- 128 瀏覽
添加回答
舉報