根据网卡名获取IP地址,以及掩码地址
2012-07-11 13:45 Rollen Holt 阅读(1882) 评论(2) 编辑 收藏 举报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 |
==============================================================================
本博客已经废弃,不在维护。新博客地址:http://wenchao.ren
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================