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://www.cnblogs.com/rollenholt/archive/2012/07/11/2586157.html,如需转载请自行联系原作者