Getting IPV4 address from a sockaddr structure

后端 未结 6 1751
一整个雨季
一整个雨季 2020-12-07 22:32

How can I extract an IP address into a string? I can\'t find a reference that tells me how char sa_data[14] is encoded.

6条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-07 22:47

    inet_ntoa() works for IPv4; inet_ntop() works for both IPv4 and IPv6.

    Given an input struct sockaddr *res, here are two snippets of code (tested on macOS):

    Using inet_ntoa()

    #include 
    
    struct sockaddr_in *addr_in = (struct sockaddr_in *)res;
    char *s = inet_ntoa(addr_in->sin_addr);
    printf("IP address: %s\n", s);
    

    Using inet_ntop()

    #include 
    #include 
    
    char *s = NULL;
    switch(res->sa_family) {
        case AF_INET: {
            struct sockaddr_in *addr_in = (struct sockaddr_in *)res;
            s = malloc(INET_ADDRSTRLEN);
            inet_ntop(AF_INET, &(addr_in->sin_addr), s, INET_ADDRSTRLEN);
            break;
        }
        case AF_INET6: {
            struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)res;
            s = malloc(INET6_ADDRSTRLEN);
            inet_ntop(AF_INET6, &(addr_in6->sin6_addr), s, INET6_ADDRSTRLEN);
            break;
        }
        default:
            break;
    }
    printf("IP address: %s\n", s);
    free(s);
    

提交回复
热议问题