网络信息
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++