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