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 |