linux c/c++ 如何获取网络接口名称呢?

时间:2020-12-02 15:22:42
比如有多张网卡。 使用 ifconfig 的命令 可以看到 eth0 eth1 lo 等。。并且会显示他们的详细信息,我要如何获得  eth0 eth1 这些名称呢?

8 个解决方案

#1


ioctl.

#2


我也想指定, 期待中。。。

#3


Each network interface in a system corresponds to a path through which messages may be sent and received. A network interface usually has a hardware device associated with it, though certain interfaces such as the loopback interface, lo(4), do not.
The following ioctl(2) calls may be used to manipulate network interfaces. The ioctl is made on a socket (typically of type SOCK_DGRAM) in the desired domain. Most of the requests supported in earlier releases take an 
.Vt ifreq structure as its parameter. This structure has the form

struct  ifreq {
#define    IFNAMSIZ    16
    char    ifr_name[IFNAMSIZ];        /* if name, e.g. "en0" */
    union {
        struct    sockaddr ifru_addr;
        struct    sockaddr ifru_dstaddr;
        struct    sockaddr ifru_broadaddr;
        short     ifru_flags[2];
        short     ifru_index;
        int       ifru_metric;
        int       ifru_mtu;
        int       ifru_phys;
        int       ifru_media;
        caddr_t   ifru_data;
        int       ifru_cap[2];
    } ifr_ifru;
#define ifr_addr      ifr_ifru.ifru_addr      /* address */
#define ifr_dstaddr   ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags     ifr_ifru.ifru_flags[0]  /* flags (low 16 bits) */
#define ifr_flagshigh ifr_ifru.ifru_flags[1]  /* flags (high 16 bits) */
#define ifr_metric    ifr_ifru.ifru_metric    /* metric */
#define ifr_mtu       ifr_ifru.ifru_mtu       /* mtu */
#define ifr_phys      ifr_ifru.ifru_phys      /* physical wire */
#define ifr_media     ifr_ifru.ifru_media     /* physical media */
#define ifr_data      ifr_ifru.ifru_data      /* for use by interface */
#define ifr_reqcap    ifr_ifru.ifru_cap[0]    /* requested capabilities */
#define ifr_curcap    ifr_ifru.ifru_cap[1]    /* current capabilities */
#define ifr_index     ifr_ifru.ifru_index     /* interface index */
};

#5


mark

#6


ifr_name 就应该是我想要获取的。。但是我怎么取得他呢?

#7


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>

int main()
{
int i=0;
int sockfd;
struct ifconf ifconf;
unsigned char buf[512];
struct ifreq *ifreq;

//初始化ifconf
ifconf.ifc_len = 512;
ifconf.ifc_buf = buf;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
{
perror("socket");
exit(1);
}  
ioctl(sockfd, SIOCGIFCONF, &ifconf);    //获取所有接口信息

//接下来一个一个的获取IP地址
ifreq = (struct ifreq*)buf;  
for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)
{
//      if(ifreq->ifr_flags == AF_INET){            //for ipv4
printf("name = [%s]\n", ifreq->ifr_name);
printf("local addr = [%s]\n", 
inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
ifreq++;
//  }
}
return 0;
}

#8


引用 7 楼 stevphen 的回复:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>

int main()
{
int i……


++

#1


ioctl.

#2


我也想指定, 期待中。。。

#3


Each network interface in a system corresponds to a path through which messages may be sent and received. A network interface usually has a hardware device associated with it, though certain interfaces such as the loopback interface, lo(4), do not.
The following ioctl(2) calls may be used to manipulate network interfaces. The ioctl is made on a socket (typically of type SOCK_DGRAM) in the desired domain. Most of the requests supported in earlier releases take an 
.Vt ifreq structure as its parameter. This structure has the form

struct  ifreq {
#define    IFNAMSIZ    16
    char    ifr_name[IFNAMSIZ];        /* if name, e.g. "en0" */
    union {
        struct    sockaddr ifru_addr;
        struct    sockaddr ifru_dstaddr;
        struct    sockaddr ifru_broadaddr;
        short     ifru_flags[2];
        short     ifru_index;
        int       ifru_metric;
        int       ifru_mtu;
        int       ifru_phys;
        int       ifru_media;
        caddr_t   ifru_data;
        int       ifru_cap[2];
    } ifr_ifru;
#define ifr_addr      ifr_ifru.ifru_addr      /* address */
#define ifr_dstaddr   ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags     ifr_ifru.ifru_flags[0]  /* flags (low 16 bits) */
#define ifr_flagshigh ifr_ifru.ifru_flags[1]  /* flags (high 16 bits) */
#define ifr_metric    ifr_ifru.ifru_metric    /* metric */
#define ifr_mtu       ifr_ifru.ifru_mtu       /* mtu */
#define ifr_phys      ifr_ifru.ifru_phys      /* physical wire */
#define ifr_media     ifr_ifru.ifru_media     /* physical media */
#define ifr_data      ifr_ifru.ifru_data      /* for use by interface */
#define ifr_reqcap    ifr_ifru.ifru_cap[0]    /* requested capabilities */
#define ifr_curcap    ifr_ifru.ifru_cap[1]    /* current capabilities */
#define ifr_index     ifr_ifru.ifru_index     /* interface index */
};

#4


#5


mark

#6


ifr_name 就应该是我想要获取的。。但是我怎么取得他呢?

#7


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>

int main()
{
int i=0;
int sockfd;
struct ifconf ifconf;
unsigned char buf[512];
struct ifreq *ifreq;

//初始化ifconf
ifconf.ifc_len = 512;
ifconf.ifc_buf = buf;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
{
perror("socket");
exit(1);
}  
ioctl(sockfd, SIOCGIFCONF, &ifconf);    //获取所有接口信息

//接下来一个一个的获取IP地址
ifreq = (struct ifreq*)buf;  
for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)
{
//      if(ifreq->ifr_flags == AF_INET){            //for ipv4
printf("name = [%s]\n", ifreq->ifr_name);
printf("local addr = [%s]\n", 
inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
ifreq++;
//  }
}
return 0;
}

#8


引用 7 楼 stevphen 的回复:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>

int main()
{
int i……


++