package task import ( "fmt" "net" "time" ) var ( TcpPort = 443 PingTimes = 4 Routines = 200 TcpConnectTimeOut = time.Second * 1 ) func (p *IPRangeList) Run() *IPRangeList { ch := make(chan struct{}, Routines) for _, ip := range p.Ips { p.wg.Add(1) ch <- struct{}{} // 控制最大并发数 go func(ip *net.IPAddr) { defer p.wg.Done() defer func() { <-ch }() // 释放并发控制 success, duration := TCPing(ip) if success { p.unusedIpCount++ } else { // 删除 } fmt.Printf("IP: %s, Success: %t, Duration: %v\n", ip.String(), success, duration) }(ip) } // 多线程执行 return p } func TCPing(ip *net.IPAddr) (bool, time.Duration) { startTime := time.Now() var fullAddress string if IsIpv4(ip.String()) { fullAddress = fmt.Sprintf("%s:%d", ip.String(), TcpPort) } else { fullAddress = fmt.Sprintf("[%s]:%d", ip.String(), TcpPort) } conn, err := net.DialTimeout("tcp", fullAddress, TcpConnectTimeOut) if err != nil { return false, 0 } defer conn.Close() duration := time.Since(startTime) return true, duration }