Linux获取网络接口信息

linux获取网络接口信息需要用到的函数为ioctl(),结构体struct ifreq,struct ifconf

1.ioctl()函数原型及作用

1 #include <sys/ioctl.h>
2
3 int ioctl(int d, int request, ...);
4
5 //参数
6 //int d:是一个文件描述符
7 //int request :表示要请求的信息。如IP地址、网络掩码等
8 //......:可变参数,根据request而定

下面是ioctl请求的request参数以及arg地址必须指向的数据类型:

2.struct ifreq结构体

  这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的

 1  /* Interface request structure used for socket ioctl‘s.  All interface
 2     ioctl‘s must have parameter definitions which begin with ifr_name.
 3     The remainder may be interface specific.  */
 4
 5 struct ifreq
 6 {
 7 # define IFHWADDRLEN    6
 8 # define IFNAMSIZ   IF_NAMESIZE
 9      union
10        {
11      char ifrn_name[IFNAMSIZ];   /* Interface name, e.g. "en0".  */
12        } ifr_ifrn;
13
14      union
15        {
16      struct sockaddr ifru_addr;
17      struct sockaddr ifru_dstaddr;
18      struct sockaddr ifru_broadaddr;
19      struct sockaddr ifru_netmask;
20      struct sockaddr ifru_hwaddr;
21      short int ifru_flags;
22      int ifru_ivalue;
23      int ifru_mtu;
24      struct ifmap ifru_map;
25      char ifru_slave[IFNAMSIZ];  /* Just fits the size */
26      char ifru_newname[IFNAMSIZ];
27      __caddr_t ifru_data;
28        } ifr_ifru;
29    };
30  # define ifr_name   ifr_ifrn.ifrn_name  /* interface name   */
31  # define ifr_hwaddr ifr_ifru.ifru_hwaddr    /* MAC address      */
32  # define ifr_addr   ifr_ifru.ifru_addr  /* address      */
33  # define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */
34  # define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */
35  # define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */
36  # define ifr_flags  ifr_ifru.ifru_flags /* flags        */
37  # define ifr_metric ifr_ifru.ifru_ivalue    /* metric       */
38  # define ifr_mtu    ifr_ifru.ifru_mtu   /* mtu          */
39  # define ifr_map    ifr_ifru.ifru_map   /* device map       */
40  # define ifr_slave  ifr_ifru.ifru_slave /* slave device     */
41  # define ifr_data   ifr_ifru.ifru_data  /* for use by interface */
42  # define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */
43  # define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth   */
44  # define ifr_qlen   ifr_ifru.ifru_ivalue    /* queue length     */
45  # define ifr_newname    ifr_ifru.ifru_newname   /* New name     */
46  # define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
47  # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
48  # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

3.struct ifconf

  ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。

 1  /* Structure used in SIOCGIFCONF request.  Used to retrieve interface
 2     configuration for machine (useful for programs which must know all
 3     networks accessible).  */
 4
 5  struct ifconf
 6    {
 7      int ifc_len;            /* Size of buffer.  */
 8      union
 9        {
10      __caddr_t ifcu_buf;
11      struct ifreq *ifcu_req;
12        } ifc_ifcu;
13    };
14  # define ifc_buf    ifc_ifcu.ifcu_buf   /* Buffer address.  */
15  # define ifc_req    ifc_ifcu.ifcu_req   /* Array of structures.  */
16  # define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */
17  #endif  /* Misc.  */

下面程序是获取本机的IP地址

 1 #include <stdio.h>
 2 #include <sys/socket.h>
 3 #include <string.h>
 4 #include <sys/types.h>
 5 #include <netinet/in.h>
 6 #include <sys/ioctl.h>
 7 #include <net/if.h>
 8
 9 //#define ETH_NAME "eth0"
10 //#define NET_NAME  "wlan1"
11
12 int main(int argc, char *argv[])
13 {
14     if(argc != 2) {
15         printf("using %s <ETH_NAME>\n", argv[0]);
16         return 0;
17     }
18
19     int sock = 0;
20     struct sockaddr_in sin;
21     struct ifreq ifr;//用来保存接口的信息
22
23     sock = socket(AF_INET, SOCK_DGRAM, 0);
24     if(sock == -1) {
25         perror("socket");
26         return 1;
27     }
28
29     strcpy(ifr.ifr_name, argv[1]);
30     int ret = ioctl(sock,  SIOCGIFADDR, &ifr);//SIOCGIFADDR 获取接口地址
31     if(ret < 0) {
32         perror("ioctl");
33         return 1;
34     }
35
36     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));//将获得地址拷贝到 sockaddr_in 结构体中
37     printf("%s\n", inet_ntoa(sin.sin_addr));//显示
38     return 0;
39
40 }

运行结果如下:

时间: 2024-10-10 20:41:36

Linux获取网络接口信息的相关文章

Linux下获取网络接口信息

Linux下的网络接口信息在shell下可以很方便地使用ifconfig查看.同样,使用C/C++也可以很方便地获取接口信息. netdevice是一个低级别的访问Linux网络设备的方法.此方法通过ioctl来获取网络接口的相关信息. 这里需要借助<net/if.h>头文件中定义的ifreq结构体.此结构体包含了网络接口的名称.IP地址.广播地址.网络地址. 掩码等相关信息.在获取上述相关信息的时候需要指明网络接口的名称. 1 struct ifreq { 2 char ifr_name[I

ioctl获取网络接口信息

linux下网络程序经常在启动执行后使用ioctl获取主机的全部网络接口信息, 例如接口地址.是否支持广播,是否支持多播等. 函数原型 #include <sys/ioctl.h> int ioctl(int d, int request, ...); 返回值:成功返回0,出错返回-1 常见选项 SIOCGIFCONF 获取所有接口的列表 SIOCGIFBRDADDR 获取广播地址 SIOCGIFMTU  获取mtu linux下使用ioctl操作网络接口,需要用到两个结构体 ifconf用来

获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

转载请注明出处:windeal专栏 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq  结构体struct ifconf来获取网络接口的各种信息. ioctl 首先看ioctl()用法 ioctl()原型如下: #include <sys/ioctl.h> int ioctl(int fd, int request, ...); 参数: fd     : 文件描述符 request:  表示要请求的信息.如IP地址.网络掩码等 ...     :  后面的可变

linux获取主机信息

linux中主机的信息通常存储在/etc/hosts中,我们可以通过函数 gethostent读取该文件的信息. 注意返回的struct hostent 结构体对象的地址是一块静态缓冲区,这个静态缓冲区的地址是固定的,当多次调用gethostent的时候,后面调用 会把前面缓冲区内容覆盖掉,多次读取返回的指针指向的缓冲区的内容是一致的,这有助于防止没有释放内存而导致的内存泄漏. #include<netdb.h> #include<stdio.h> void getHostent(

Linux获取文件信息

项目中需要对文件进行处理并分析,首先需要根据要求找到该文件,比如最后修改的文件 代码实现: 1 #include <unistd.h> 2 #include <sys/stat.h> 3 #include <time.h> 4 5 #include <iostream> 6 7 using namespace std; 8 9 int main(int argc, char **argv) 10 { 11 struct stat STFile; 12 sta

java通过Linux获取命令信息并显示出来

代码如下: package test; import java.io.*; import java.nio.charset.Charset; import java.util.Properties; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import org.apac

Linux下获取网络接口ip地址

Linux 下 可以使用ioctl()函数以及结构体 struct ifreq和结构体struct ifconf来获取网络接口的各种信息. 如图,有br0和br1两个接口,当前需要获取br1的ip地址(当然其他接口信息如mac.子网掩码等都可以),方法如下: 具体过程是先通过ictol获取本地的所有接口信息,存放到ifconf结构中,再从其中取出每个ifreq表示的ip信息(一般每个网卡对应一个IP地址,如:"eth0-.eth1-"). 头文件: 1 #include <arp

linux下获取主机信息

程序源于linux程序设计这本书,个人利用这本书学习,本文作为一个知识点来学习. 这里首先介绍几个结构体: 1 2 3 4 5 6 7 struct hostent{ char* h_name;//主机名称 char* h_aliases;//主机别名 short h_addrtype;//主机地址类型 short h_length;//主机地址长度 char **h_addr_list;//主机地址列表 }   其中,主机地址类型h_addrtype为AF_INET;地址列表为字符串,长度不定

linux的帮助信息获取以及man章节的划分

linux的帮助信息获取以及man章节的划分 linux 帮助 man 章节 linux 获取帮助的途径 (1)help (2)man (3)info command在线获取 (4)程序自带帮助文档 (5)主流发行版的官方文档 (6)程序的官方文档 (7)搜索引擎(8)参考书籍 **** (1)help 内部命令 ~]#help Command 外部命令 命令自带简要格式的使用帮助 ~]#Command --help (2)man man的位置:/usr man帮助说明: NAME: 功能性说明