#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>
struct netinfo
{
char name[16];
char ip[32];
char mac[32];
char broadAddr[32];
char subnetMask[32];
};
int getNetinfo(struct netinfo *param)
{
int fd=0;int i = 0;
struct ifreq buf[16];
struct ifconf ifc;
struct ifreq ifr;
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
int interfaceNum = 0;
if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
{
perror("socket");
close(fd);
return -1;
}
if (!ioctl(fd, SIOCGIFCONF, &ifc))
{
interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
printf("interface num = %d\n", interfaceNum);
for(i=0;i<interfaceNum;i++)
{
strcpy(param[i].name, buf[i].ifr_name);
ifr = buf[i];
if (ioctl(fd, SIOCGIFFLAGS, &ifr))
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
//get the mac of this interface
if (!ioctl(fd, SIOCGIFHWADDR, &buf[i]))
{
memset(param[i].mac, 0, sizeof(param[i].mac));
snprintf(param[i].mac, sizeof(param[i].mac), "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)buf[i].ifr_hwaddr.sa_data[0],
(unsigned char)buf[i].ifr_hwaddr.sa_data[1],
(unsigned char)buf[i].ifr_hwaddr.sa_data[2],
(unsigned char)buf[i].ifr_hwaddr.sa_data[3],
(unsigned char)buf[i].ifr_hwaddr.sa_data[4],
(unsigned char)buf[i].ifr_hwaddr.sa_data[5]);
}
else
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
if (!ioctl(fd, SIOCGIFADDR, &buf[i]))
{
snprintf(param[i].ip, sizeof(param[i].ip), "%s",
(char *)inet_ntoa(((struct sockaddr_in *)&(buf[i].ifr_addr))->sin_addr));
}
else
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
//get the broad address of this interface
if (!ioctl(fd, SIOCGIFBRDADDR, &buf[i]))
{
snprintf(param[i].broadAddr, sizeof(param[i].broadAddr), "%s",
(char *)inet_ntoa(((struct sockaddr_in *)&(buf[i].ifr_broadaddr))->sin_addr));
}
else
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
//get the subnet mask of this interface
if (!ioctl(fd, SIOCGIFNETMASK, &buf[i]))
{
snprintf(param[i].subnetMask, sizeof(param[i].subnetMask), "%s",
(char *)inet_ntoa(((struct sockaddr_in *)&(buf[i].ifr_netmask))->sin_addr));
}
else
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
}
}
else
{
printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);
close(fd);
return -1;
}
close(fd);
return interfaceNum;
}
int main()
{
int i = 0;
struct netinfo info[10];
int num = getNetinfo(info);
for(i=0;i<num;i++)
{
printf("name:%s\nip:%s\nmac:%s\nbroadAddr:%s\nsubnetMask:%s\n",info[i].name,info[i].ip,info[i].mac,info[i].broadAddr,info[i].subnetMask);
}
return 0;
}
转载于:https://my.oschina.net/windyhon/blog/488406