MCPcopy Index your code
hub / github.com/MengMengCode/GetRealityDomain / expandCIDR

Function expandCIDR

utils.go:142–190  ·  view source on GitHub ↗

expandCIDR 展开CIDR为所有包含的IP地址

(host Host, hostChan chan<- Host)

Source from the content-addressed store, hash-verified

140
141// expandCIDR 展开CIDR为所有包含的IP地址
142func expandCIDR(host Host, hostChan chan<- Host) {
143 _, ipNet, err := net.ParseCIDR(host.Origin)
144 if err != nil {
145 printError(fmt.Sprintf("解析CIDR失败: %s - %v", host.Origin, err))
146 return
147 }
148
149 count := 0
150 maxHosts := 65536 // 限制最大主机数,防止内存溢出
151
152 // 获取网络地址和掩码
153 ip := make(net.IP, len(ipNet.IP))
154 copy(ip, ipNet.IP)
155
156 // 计算网络中的主机数
157 ones, bits := ipNet.Mask.Size()
158 if bits-ones > 16 { // 如果主机位超过16位,限制扫描范围
159 printError(fmt.Sprintf("CIDR %s 包含的主机数过多,已限制为前%d个", host.Origin, maxHosts))
160 }
161
162 // 遍历网络中的所有IP
163 for {
164 if !ipNet.Contains(ip) {
165 break
166 }
167
168 if count >= maxHosts {
169 printError(fmt.Sprintf("CIDR %s 包含的主机数超过限制(%d),已截断", host.Origin, maxHosts))
170 break
171 }
172
173 // 创建新的Host并发送到channel
174 newHost := Host{
175 IP: make(net.IP, len(ip)),
176 Origin: host.Origin,
177 Type: HostTypeIP,
178 }
179 copy(newHost.IP, ip)
180 hostChan <- newHost
181
182 // 递增IP地址
183 ip = NextIP(ip, true)
184 count++
185 }
186
187 if config.Verbose {
188 printInfo(fmt.Sprintf("CIDR %s 展开为 %d 个IP地址", host.Origin, count))
189 }
190}
191
192// IterateAddr 无限扫描模式,从指定IP开始向上下扩展
193func IterateAddr(addr string) <-chan Host {

Callers 1

IterateFunction · 0.85

Calls 3

printErrorFunction · 0.85
NextIPFunction · 0.85
printInfoFunction · 0.85

Tested by

no test coverage detected