C++ 验证IPv6网络掩码前缀

C++ 验证IPv6网络掩码前缀,c++,networking,ipv6,C++,Networking,Ipv6,我需要验证某个IPv6前缀。我了解到inet_pton()可以用于验证IPv6地址本身,但它不接受前缀长度和地址(fec1::9/96) 如何在C/C++中验证IPv6前缀 谢谢 IPv6有一个简单的格式。您可以通过解析IPv6字符串来完成此操作 这可能会帮助您: /@param[in]cidr\包含IPv6网络地址(作为字符串)和路由前缀 bool-valid\u-ipv6\u-cidr(std::pair-const&cidr){ if(cidr_u.first.find(':')!=

我需要验证某个IPv6前缀。我了解到inet_pton()可以用于验证IPv6地址本身,但它不接受前缀长度和地址(fec1::9/96)

如何在C/C++中验证IPv6前缀


谢谢

IPv6有一个简单的格式。您可以通过解析IPv6字符串来完成此操作

这可能会帮助您:

/@param[in]cidr\包含IPv6网络地址(作为字符串)和路由前缀
bool-valid\u-ipv6\u-cidr(std::pair-const&cidr){
if(cidr_u.first.find(':')!=std::string::npos){
_错误_msg=“IPv6地址不包含“:”;
返回false;
}
6_addr addr6中的结构;
如果(!inet_pton(AF_INET6,cidr_.first.c_str(),&(addr6.s6_addr))){
_错误\u msg=“无效的IPv6地址”;
返回false;
}
uint16\u t路由前缀=cidr\u.second;
如果(路由前缀>最大IPV6\U CIDR\U掩码){//最大IPV6\U CIDR\U掩码=128
_错误\u msg=“无效的IPv6 CIDR掩码”;
返回false;
}
对于(尺寸i=0;i=8){
路由_前缀-=8;
}else if(路由_前缀==0){
字节\网络掩码=0;
}else{//routing_前缀介于1和7之间,包括1和7

byte_netmask Hi,我实际上很想知道验证给定IPv6前缀的算法。通过验证,我打算验证IPv6前缀(地址部分和前缀长度)是否有效。“验证”假设一个客观的标准。你想要什么?仅仅是语法检查?检查网络是否真的处于活动状态?还是介于两者之间?
// @param[in] cidr_ - contains an IPv6 network address (as a string) and a routing prefix
bool valid_ipv6_cidr(std::pair<std::string, uint16_t> const& cidr_) {
    if(cidr_.first.find(':') != std::string::npos) {
        _error_msg = "IPv6 address does not contain a ':'";
        return false;
    }
    struct in6_addr addr6;
    if(!inet_pton(AF_INET6, cidr_.first.c_str(), &(addr6.s6_addr))) {
        _error_msg = "invalid IPv6 address";
        return false;
    }
    uint16_t routing_prefix = cidr_.second;
    if(routing_prefix > MAX_IPV6_CIDR_MASK) {   // MAX_IPV6_CIDR_MASK = 128
        _error_msg = "invalid IPv6 CIDR mask";
        return false;
    }
    for(size_t i=0; i<16; i++) {
        uint8_t byte_netmask = 0xff;
        if(routing_prefix >= 8) {
            routing_prefix -= 8;
        } else if(routing_prefix == 0) {
            byte_netmask = 0;
        } else {    // routing_prefix is between 1 and 7, inclusive
            byte_netmask <<= (8 - routing_prefix);
            routing_prefix = 0;
        }
        //std::cout << "DEBUG: mask=" << std::hex
        //  << static_cast<unsigned>(byte_netmask)  << std::dec << std::endl;
        if( (addr6.s6_addr[i] & byte_netmask) != addr6.s6_addr[i] ) {
            std::ostringstream oss;
            oss << "invalid CIDR: " << cidr_.first      << '/'
                << cidr_.second     << " - mask ("      << std::hex
                << static_cast<unsigned>(byte_netmask)  << std::dec
                << ") failed at byte "
                << i << " (" << std::hex 
                << static_cast<unsigned>(addr6.s6_addr[i]) << std::dec << ')';
            _error_msg = oss.str();
            return false;
        }
    }
    // check for special case ..../0
    if( (cidr_.second == 0) && (cidr_.first != "::") ) {
        _error_msg = "invalid CIDR - /0 found with something other than ::";
        return false;
    }
    return true;
}