惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
B
Blog
WordPress大学
WordPress大学
Project Zero
Project Zero
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
F
Full Disclosure
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News: Ask HN
Hacker News: Ask HN
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
O
OpenAI News
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
IT之家
IT之家
U
Unit 42
腾讯CDC
S
Security Affairs
C
Cisco Blogs
Schneier on Security
Schneier on Security
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss

博客园 - LiuYanYGZ

2025.04.15交通事故记录(沈阳、爸爸) 10KG、2KG盘称 摩托车贝纳利302S换机油 excel身份证号验证 在本机A中执行expect脚本:ssh到B,在B机器上从A机器scp文件到B 妈妈的药:血府逐瘀丸、天麻钩藤颗粒、半夏白术天麻汤、杞菊地黄丸、当归补血汤、糠酸莫米松凝胶、尿素维E乳膏 桂附地黄丸、舒筋活血片 辽宁省沈阳市居住证办理2026.01.21 北京健康证(立水桥地铁站附近)第二次去2025.12.28 鼻窦炎、鼻炎、花粉过敏 70迈M800后摄像头改装 D07线 京B摩托车第6年年检,《京顺机动车检测场》150元不用预约 source insight4菜单工具按钮变乱恢复 探索Go语言性能优化:全面解析pprof工具 __attribute__((visibility(“default“)))含义 ls | tee 1.txt 如何拿到ls的返回值$? 使用golang访问linux telnet服务器 手机CPU性能天梯图 Poedit Pro国际化翻译编辑器 Proe和Creo的区别 Ubuntu修改DNS方法(临时和永久修改DNS) Ubuntu中apt设置国内源(以阿里云为例) Ghidra(反汇编工具)
检查一个IP地址是否在一个网段中
LiuYanYGZ · 2025-09-30 · via 博客园 - LiuYanYGZ
package main

import (
    "fmt"
    "net"
    //"strconv"
    //"strings"
)

// IPRangeCheckerBitwise 使用位运算的 IP 范围检查器
type IPRangeCheckerBitwise struct {
    network     *net.IPNet
    //networkAddr uint32
    //mask        uint32
    startIP     net.IP
    endIP       net.IP
}

// NewIPRangeCheckerBitwise 创建位运算检查器
func NewIPRangeCheckerBitwise(networkCIDR, startIP, endIP string) (*IPRangeCheckerBitwise, error) {
    checker := &IPRangeCheckerBitwise{}
    
    // 解析网络 CIDR
    _, network, err := net.ParseCIDR(networkCIDR)
    if err != nil {
        return nil, err
    }
    checker.network = network
    // 计算网络地址和掩码的整数形式
    //checker.networkAddr = ipToUint32(network.IP.To4())
    //checker.mask = ipToUint32(net.IP(network.Mask).To4())
    
    // 解析起始和结束 IP
    start := net.ParseIP(startIP)
    end := net.ParseIP(endIP)
    if start == nil {
        return nil, fmt.Errorf("无效的 IP 地址: %s", startIP)
    }
    if end == nil {
        return nil, fmt.Errorf("无效的 IP 地址: %s", endIP)
    }
    
    start = start.To4()
    end = end.To4()
    if start == nil {
        return nil, fmt.Errorf("无效的起始 IP: %s", startIP)
    }
    if end == nil {
        return nil, fmt.Errorf("无效的结束 IP: %s", endIP)
    }

    if !network.Contains(start) {
        return nil, fmt.Errorf("startIP(%s) not in: %s", startIP, networkCIDR)
    }
    if !network.Contains(end) {
        return nil, fmt.Errorf("endIP(%s) not in: %s", endIP, networkCIDR)
    }

    if ipToUint32(start) > ipToUint32(end) {
        return nil, fmt.Errorf("startIP(%s) should <= endIP(%s)", startIP, endIP)
    }
    
    checker.startIP = start
    checker.endIP = end
    
    return checker, nil
}

// ipToUint32 将 IP 转换为 32 位无符号整数
func ipToUint32(ip net.IP) uint32 {
    ip = ip.To4()
    return uint32(ip[0])<<24 | uint32(ip[1])<<16 | uint32(ip[2])<<8 | uint32(ip[3])
}

// Check 检查 IP 是否在范围内
func (c *IPRangeCheckerBitwise) Check(ipStr string) (bool, error) {
    ip := net.ParseIP(ipStr)
    if ip == nil {
        return false, fmt.Errorf("无效的 IP 地址: %s", ipStr)
    }
    
    ip = ip.To4()
    if ip == nil {
        return false, fmt.Errorf("需要 IPv4 地址: %s", ipStr)
    }
    
    // 检查是否在指定网络中
    if !c.network.Contains(ip) {
        return false, nil
    }

    // 检查是否在指定范围内
    return ipToUint32(ip) >= ipToUint32(c.startIP) && ipToUint32(ip) <= ipToUint32(c.endIP), nil
}

func main() {
    // 创建针对特定范围的检查器
    checker, err := NewIPRangeCheckerBitwise("192.168.30.1/24", "192.168.30.1", "192.168.30.255")
    if err != nil {
        fmt.Printf("NewIPRangeCheckerBitwise Failed: %v\n", err)
        return
    }
    testIPs := []string{
        "192.168.29.255",
        "192.168.30.1",
        "192.168.30.2",
        "192.168.30.255",
        "192.168.31.0",
        "192.168.31.250",
        "192.168.31.251",
        "192.168.32.0",
    }
    
    fmt.Println("位运算检查器:")
    for _, ip := range testIPs {
        result, err := checker.Check(ip)
        if err != nil {
            fmt.Printf("IP: %-15s 错误: %v\n", ip, err)
        } else {
            fmt.Printf("IP: %-15s 在范围内: %t\n", ip, result)
        }
    }
    
    // 验证位运算结果
    //fmt.Println("\n位运算验证:")
    //fmt.Printf("网络地址: 192.168.30.0 = 0x%X\n", checker.networkAddr)
    //fmt.Printf("掩码: 255.255.254.0 = 0x%X\n", checker.mask)
    //fmt.Printf("起始IP: 192.168.30.2 = 0x%X\n", checker.startIP)
    //fmt.Printf("结束IP: 192.168.31.250 = 0x%X\n", checker.endIP)
}