根据网卡名获取IP地址,以及掩码地址

简介:

nterface name is something like “eth0″ and the ip address of the interface can be retrieved using the ioctl function.
Here is a simple piece of code that demonstrates how :

Code

1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/socket.h>
5 #include <sys/ioctl.h>
6 #include <netinet/in.h>
7 #include <net/if.h>
8 #include <unistd.h>
9 #include <arpa/inet.h>
10  
11 int main()
12 {
13     int fd;
14     struct ifreq ifr;
15      
16     char iface[] = "eth0";
17      
18     fd = socket(AF_INET, SOCK_DGRAM, 0);
19  
20     //Type of address to retrieve - IPv4 IP address
21     ifr.ifr_addr.sa_family = AF_INET;
22  
23     //Copy the interface name in the ifreq structure
24     strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
25  
26     ioctl(fd, SIOCGIFADDR, &ifr);
27  
28     close(fd);
29  
30     //display result
31     printf("%s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
32  
33     return 0;
34 }

Output

1 $ gcc ioctl.c && ./a.out
2 eth0 - 192.168.0.6

The socket used can be a TCP socket (SOCK_STREAM) as well.

If you also need the netmask then use the SIOCGIFNETMASK value in ioctl like this :

1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <sys/ioctl.h>
5 #include <net/if.h>
6 #include <unistd.h>
7 #include <arpa/inet.h>
8  
9 int main()
10 {
11     int fd;
12     struct ifreq ifr;
13      
14     char iface[] = "eth0";
15      
16     fd = socket(AF_INET, SOCK_DGRAM, 0);
17  
18     //Type of address to retrieve - IPv4 IP address
19     ifr.ifr_addr.sa_family = AF_INET;
20  
21     //Copy the interface name in the ifreq structure
22     strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
23      
24     //get the ip address
25     ioctl(fd, SIOCGIFADDR, &ifr);
26      
27     //display ip
28     printf("IP address of %s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
29      
30     //get the netmask ip
31     ioctl(fd, SIOCGIFNETMASK, &ifr);
32      
33     //display netmask
34     printf("Netmask of %s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
35      
36     close(fd);
37      
38     return 0;
39 }

Output :

1 $ gcc ioctl.c && ./a.out
2 IP address of eth0 - 192.168.0.6
3 Netmask of eth0 - 255.255.255.0
目录
相关文章
|
2月前
|
网络协议 网络架构
IP-IS_IS P2P网路类型地址不在同一子网
IP-IS_IS P2P网络类型是指在使用IS-IS协议的情况下,路由器之间的直接点对点链接。当这些路由器的IP地址不在同一子网时,它们仍然可以通过IS-IS协议传递路由信息,成功地在网络中互联。这种设计允许更大的网络灵活性和可扩展性,并且对于保持网络连通性至关重要。掌握IS-IS和点对点链接的配置对于网络工程师来说是一项基本且重要的技能。
36 2
|
6月前
|
负载均衡 安全 Linux
为何一个网卡需要配置多个IP地址?🌐
在Linux环境中,一个网卡配置多个IP地址是一个常见且强大的网络管理策略🛠️。这种策略不仅增加了网络的灵活性和效率,还能满足特定的网络需求和应用场景🎯。让我们一探究竟,看看在哪些情况下,为什么一个网卡会需要配置多个IP地址,并探讨不配置多个IP地址的后果。
为何一个网卡需要配置多个IP地址?🌐
|
6月前
|
安全 网络协议 测试技术
网络地址 0.0.0.0 与回环地址 127.0.0.1 的区别
网络地址 0.0.0.0 与回环地址 127.0.0.1 的区别
158 0
IP地址10.224.12.1的子网掩码为255.240.0.0,和该地址在同一子网中的地址是
IP地址10.224.12.1的子网掩码为255.240.0.0,和该地址在同一子网中的地址是
146 0
|
安全
为什么要区分不同的网段IP地址
为什么要区分不同的网段IP地址
141 0