Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 转到如何列出网络中的所有IP_Go_Cidr - Fatal编程技术网

Go 转到如何列出网络中的所有IP

Go 转到如何列出网络中的所有IP,go,cidr,Go,Cidr,Python在ipaddress模块中有一个方法来列出网络中的所有IP。例如 import ipaddress ips = [ip for ip in ipaddress.ip_network('8.8.8.0/24').hosts()] 在Go中如何做同样的事情?没有标准的库函数可以做到这一点。但是你自己写是微不足道的。您可以使用它作为起点,然后构建一个for循环,该循环遍历网络中的所有有效值。您可以使用它为相应的网络生成一个*IPNet 我根据亚当·汉娜在这篇文章中的描述找到了一种方法-

Python在
ipaddress
模块中有一个方法来列出网络中的所有IP。例如

import ipaddress
ips = [ip for ip in ipaddress.ip_network('8.8.8.0/24').hosts()]

在Go中如何做同样的事情?

没有标准的库函数可以做到这一点。但是你自己写是微不足道的。您可以使用它作为起点,然后构建一个for循环,该循环遍历网络中的所有有效值。

您可以使用它为相应的网络生成一个*IPNet

我根据亚当·汉娜在这篇文章中的描述找到了一种方法-

主程序包
进口(
“fmt”
“日志”
“净额”
“时间”
)
func主机(cidr字符串)([]字符串,int,错误){
ip,ipnet,错误:=net.ParseCIDR(cidr)
如果错误!=零{
返回nil、0、err
}
var ips[]字符串
对于ip:=ip.Mask(ipnet.Mask);ipnet.Contains(ip);inc(ip){
ips=append(ips,ip.String())
}
//删除网络地址和广播地址
lenIPs:=len(ips)
开关{
病例组<2:
返回IP、LenIP、零
违约:
返回ips[1:len(ips)-1],lenIPs-2,无
}
}
func公司(ip net.ip){
对于j:=len(ip)-1;j>=0;j--{
ip[j]++
如果ip[j]>0{
打破
}
}
}
func main(){
IP、计数、错误:=主机(“8.8.8.0/24”)
如果错误!=零{
log.Fatal(错误)
}

对于n:=0;n将CIDR地址和网络掩码转换为uint32。找到开始和结束,然后在uint32上循环以获取地址

package main

import (
    "encoding/binary"
    "fmt"
    "log"
    "net"
)

func main() {
    // convert string to IPNet struct
    _, ipv4Net, err := net.ParseCIDR("192.168.255.128/25")
    if err != nil {
        log.Fatal(err)
    }

    // convert IPNet struct mask and address to uint32
    // network is BigEndian
    mask := binary.BigEndian.Uint32(ipv4Net.Mask)
    start := binary.BigEndian.Uint32(ipv4Net.IP)

    // find the final address
    finish := (start & mask) | (mask ^ 0xffffffff)

    // loop through addresses as uint32
    for i := start; i <= finish; i++ {
         // convert back to net.IP
        ip := make(net.IP, 4)
        binary.BigEndian.PutUint32(ip, i)
        fmt.Println(ip)
    }

}
主程序包
进口(
“编码/二进制”
“fmt”
“日志”
“净额”
)
func main(){
//将字符串转换为IPNet结构
_,ipv4Net,err:=net.ParseCIDR(“192.168.255.128/25”)
如果错误!=零{
log.Fatal(错误)
}
//将IPNet结构掩码和地址转换为uint32
//网络是BigEndian的
掩码:=二进制.BigEndian.Uint32(ipv4Net.mask)
start:=binary.BigEndian.Uint32(ipv4Net.IP)
//找到最终地址
完成:=(开始和遮罩)|(遮罩^0xFFFFFF)
//将地址循环为uint32

for i:=start;i最后一个for循环导致运行时错误:索引超出范围。通过“for n:=0;npackage main import ( "encoding/binary" "fmt" "log" "net" ) func main() { // convert string to IPNet struct _, ipv4Net, err := net.ParseCIDR("192.168.255.128/25") if err != nil { log.Fatal(err) } // convert IPNet struct mask and address to uint32 // network is BigEndian mask := binary.BigEndian.Uint32(ipv4Net.Mask) start := binary.BigEndian.Uint32(ipv4Net.IP) // find the final address finish := (start & mask) | (mask ^ 0xffffffff) // loop through addresses as uint32 for i := start; i <= finish; i++ { // convert back to net.IP ip := make(net.IP, 4) binary.BigEndian.PutUint32(ip, i) fmt.Println(ip) } }