IPv6 parsing in C

前端 未结 7 1114
猫巷女王i
猫巷女王i 2020-12-15 08:35

I wanted to know how I can parse an IPv6 address in C and convert it to a 128 bit value?

So a hex address like 1:22:333:aaaa:b:c:d:e needs to be convert

7条回答
  •  北海茫月
    2020-12-15 08:58

    You can use getaddrinfo() POSIX function. It is more flexible than inet_pton(), for example it automatically detects IPv4 and IPv6 address formats, it can resolve even hostnames (using DNS resolving) and port/service names (using /etc/services).

    #include 
    #include 
    #include 
    
    ....
    
    const char *ip6str = "::2";
    
    struct sockaddr_storage result;
    socklen_t result_len;
    
    struct addrinfo *res = NULL;
    struct addrinfo hints;
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_DEFAULT | AI_NUMERICHOST | AI_NUMERICSERV;
    
    rc = getaddrinfo(ip6str, NULL, &hints, &res);
    if (rc != 0)
    {
        fprintf(stderr, "Failure to parse host '%s': %s (%d)", ip6str, gai_strerror(rc), rc);
        return -1;
    }
    
    if (res == NULL)
    {
        // Failure to resolve 'ip6str'
        fprintf(stderr, "No host found for '%s'", ip6str);
        return -1;
    }
    
    // We use the first returned entry
    result_len = res->ai_addrlen;
    memcpy(&result, res->ai_addr, res->ai_addrlen);
    
    freeaddrinfo(res);
    

    The IPv6 address is stored in the struct sockaddr_storage result variable.

    if (result.ss_family == AF_INET6) // Ensure that we deal with IPv6
    {
        struct sockaddr_in6 * sa6 = (struct sockaddr_in6 *) &result;
        struct in6_addr * in6 = &sa6->sin6_addr;
        in6->s6_addr[0]; // This is a first byte of the IPv6
        in6->s6_addr[15]; // This is a last byte of the IPv6
    }
    

提交回复
热议问题