根据网卡名获取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
2eth0 - 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
2IP address of eth0 - 192.168.0.6
3Netmask of eth0 - 255.255.255.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值