鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

网络信息

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]);