# include # include # include # include # include # include # include # include # include # include int main(int argc, char* argv[]){ struct ifconf ifc; struct ifreq *ifr, ifrcopy; int flags; char *buf, *ptr; int len; int sockfd; struct sockaddr_in *sad; sockfd = socket(AF_INET,SOCK_DGRAM,0); if ( sockfd == -1 ) { perror ("socket"); return 1; } len = 100 * sizeof(struct ifreq); buf = malloc(len); ifc.ifc_len = len; ifc.ifc_buf = buf; if ( ioctl(sockfd, SIOCGIFCONF, &ifc ) == -1) { if ( errno != EINVAL ) { perror("ioctl"); return 2; } else printf("not all interfaces fit in buf\n"); } for (ptr = buf; ptr < buf + ifc.ifc_len; ){ ifr = (struct ifreq *)ptr; # if 1 ptr += sizeof (ifr->ifr_name) + sizeof(struct sockaddr); # else ptr += sizeof (ifr->ifr_name) + ifr->ifr_addr.sa_len; # endif ifrcopy = *ifr; ioctl(sockfd,SIOCGIFFLAGS,&ifrcopy); flags = ifrcopy.ifr_flags; if ( (flags & IFF_UP) == 0 ) continue; /* interface is down */ sad = (struct sockaddr_in *)(&ifr->ifr_addr); printf("%s %s\n", ifr->ifr_name, inet_ntoa( sad->sin_addr) ); } return 0; }