获取linux系统下网络接口名称

IT民工者 2014-05-19 10:21:10
为了获取linux系统下的ip mac 等等一些信息,但在不同的PC上,网络接口的名称不一致,导致获取一些信息时不兼容,如何用C++获取网络接口名称?如eht0 em1等等
...全文
732 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
辉hoi 2014-07-04
  • 打赏
  • 举报
回复
获取指定接口IP

#include <stdio.h>  
#include <stdlib.h>  
#include <stdint.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <sys/ioctl.h>  
#include <sys/socket.h>  
#include <net/if.h>  
  
#define NIPQUAD(addr) \  
    ((unsigned char *)&addr)[0], \  
    ((unsigned char *)&addr)[1], \  
    ((unsigned char *)&addr)[2], \  
    ((unsigned char *)&addr)[3]  
#define NIPQUAD_FMT "%u.%u.%u.%u"  
  
uint32_t obtain_ip(const char *dev)  
{  
    int fd = -1;  
    struct ifreq ifr;  
    struct sockaddr_in *addr;  
  
    strncpy(ifr.ifr_name, dev, IFNAMSIZ);  
  
    fd = socket(AF_INET, SOCK_DGRAM, 0);  
    if (fd < 0)  
    {  
        perror("socket()");  
        return 0;  
    }  
  
    if (ioctl(fd, SIOCGIFADDR, &ifr))  
    {  
        perror("ioctl()");  
        close(fd);  
        return 0;  
    }  
  
    close(fd);  
  
    addr = (struct sockaddr_in *)&(ifr.ifr_addr);  
    return addr->sin_addr.s_addr;  
}  
  
int main(int argc, char **argv)  
{  
    uint32_t ip = obtain_ip(argv[1]);  
  
    if (ip)  
        printf("ip: %u.%u.%u.%u\n", NIPQUAD(ip));  
    return 0;  
}  
或指定接口MAC

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/ioctl.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <net/if.h>  
#include <assert.h>  
  
int obtain_mac(const char *ifname, unsigned char *mac, int len)  
{  
    int sk = -1, ret = 0;  
    struct ifreq ifreq;  
  
    assert(ifname);  
    assert(mac);  
    assert(len >= 6);  
  
    sk = socket(AF_INET, SOCK_STREAM, 0);  
    if (sk < 0)  
    {  
        perror("socket");  
        ret--;  
        goto OUT;  
    }  
  
    strcpy(ifreq.ifr_name, ifname);  
    if (ioctl(sk, SIOCGIFHWADDR, &ifreq) < 0)  
    {  
        perror("ioctl");  
        ret--;  
        goto OUT;  
    }  
    memcpy(mac, (unsigned char *)ifreq.ifr_hwaddr.sa_data, 6);  
  
OUT:  
    if (sk >= 0)  
        close(sk);  
    return ret;  
}  
  
int main(int argc, char **argv)  
{  
    unsigned char mac[12];  
  
    if (obtain_mac(argv[1], mac, sizeof(mac)) < 0)  
        return -1;  
  
    printf("%02X:%02X:%02X:%02X:%02X:%02X\n",   
           mac[0],  
           mac[1],  
           mac[2],  
           mac[3],  
           mac[4],  
           mac[5]  
           );  
  
    return 0;  
} 
xiaoqiao_82 2014-07-04
  • 打赏
  • 举报
回复
http://man7.org/linux/man-pages/man7/netdevice.7.html
liliyangliuwei 2014-07-03
  • 打赏
  • 举报
回复
楼主,求共享方法!
赵4老师 2014-05-19
  • 打赏
  • 举报
回复
system("ifconfig >ifconfig.txt"); //然后读文件ifconfig.txt的内容 真想不用命令,请参考ifconfig命令对应的源代码。
IT民工者 2014-05-19
  • 打赏
  • 举报
回复
亲,谢谢,已解决
IT民工者 2014-05-19
  • 打赏
  • 举报
回复
引用 1 楼 buyong 的回复:
ifconfig
不用命令
buyong 2014-05-19
  • 打赏
  • 举报
回复
ifconfig
qq120848369 2014-05-19
  • 打赏
  • 举报
回复
ioctl可以获取噢。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧