inet_ntoa() works for IPv4; inet_ntop() works for both IPv4 and IPv6.
Given the input of struct sockaddr *res , here are two pieces of code:
Using inet_ntoa ()
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 ()
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);
jrc Mar 19 '15 at 14:22 2015-03-19 14:22
source share