网络信息
getifaddrs()接口可以获取系统所有的网络接口信息,下面通过getifaddrs本地网络接口名、IP、广播地址、子网掩码的代码示例。
struct sockaddr_in *sin = NULL;
struct ifaddrs *ifa = NULL, *ifList;
if (getifaddrs(&ifList) < 0)
{
return -1;
}
for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next)
{
if(ifa->ifa_addr->sa_family == AF_INET)
{
// 获取网口名称
printf("\n>>> interfaceName: %s\n", ifa->ifa_name);
// 获取IP地址
sin = (struct sockaddr_in *)ifa->ifa_addr;
printf(">>> ipAddress: %s\n", inet_ntoa(sin->sin_addr));
// 获取广播地址
sin = (struct sockaddr_in *)ifa->ifa_dstaddr;
printf(">>> broadcast: %s\n", inet_ntoa(sin->sin_addr));
// 获取子网掩码
sin = (struct sockaddr_in *)ifa->ifa_netmask;
printf(">>> subnetMask: %s\n", inet_ntoa(sin->sin_addr));
}
}
freeifaddrs(ifList);
getifaddrs 函数里没有MAC地址的信息。配合宏SIOCGIFHWADDR、SIOCGIFADDR、SIOCGIFBRDADDR与SIOCGIFNETMASK作为参数调用函数ioctl可以获得MAC地址。
struct ifreq ifreq;
int sock;
if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
{
perror ("socket");
return -1;
}
strcpy (ifreq.ifr_name, "eth0"); //Currently, only get eth0
if (ioctl (sock, SIOCGIFHWADDR, &ifreq) < 0)
{
perror ("ioctl");
return -1;
}
return snprintf (mac, len_limit, "%X:%X:%X:%X:%X:%X", (unsigned char) ifreq.ifr_hwaddr.sa_data[0], (unsigned char) ifreq.ifr_hwaddr.sa_data[1], (unsigned char) ifreq.ifr_hwaddr.sa_data[2], (unsigned char) ifreq.ifr_hwaddr.sa_data[3], (unsigned char) ifreq.ifr_hwaddr.sa_data[4], (unsigned char) ifreq.ifr_hwaddr.sa_data[5]);
父主题: C/C++