I need to display all the IP addresses from my local computer, using the C language. How can this be done?
-
15`puts("127.0.0.1");` Just kidding :) – pmg Jan 07 '10 at 15:50
-
2All of which IP addresses? The IP addresses the computer is assigned? The IP addresses on your network? Moreover, what platform are you working on? The C language itself knows nothing about IP. It would have to make operating system calls, and those may differ between operating systems. – David Thornley Jan 07 '10 at 15:54
-
6It's tagged "linux" – Jan 07 '10 at 15:55
-
3int i,j,k,l; for(i=0;i<256;++i) { for(j=0;j<256;++j) { for(k=0;k<256;++k) { for(l=0;l<256;++l) { printf("\n%d.%d.%d.%d",i,j,k,l); } } } } :) – Jacob Jan 07 '10 at 15:56
-
2@Jacob: he said all the IP addresses, not all the IPv4 addresses ;-) – Steve Jessop Jan 07 '10 at 18:39
8 Answers
#include <stdio.h>
#include <stropts.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/netdevice.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
int print_addresses(const int domain)
{
int s;
struct ifconf ifconf;
struct ifreq ifr[50];
int ifs;
int i;
s = socket(domain, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
return 0;
}
ifconf.ifc_buf = (char *) ifr;
ifconf.ifc_len = sizeof ifr;
if (ioctl(s, SIOCGIFCONF, &ifconf) == -1) {
perror("ioctl");
return 0;
}
ifs = ifconf.ifc_len / sizeof(ifr[0]);
printf("interfaces = %d:\n", ifs);
for (i = 0; i < ifs; i++) {
char ip[INET_ADDRSTRLEN];
struct sockaddr_in *s_in = (struct sockaddr_in *) &ifr[i].ifr_addr;
if (!inet_ntop(domain, &s_in->sin_addr, ip, sizeof(ip))) {
perror("inet_ntop");
return 0;
}
printf("%s - %s\n", ifr[i].ifr_name, ip);
}
close(s);
return 1;
}
int main(int argc, char *argv[])
{
int domains[] = { AF_INET, AF_INET6 };
int i;
for (i = 0; i < sizeof(domains) / sizeof(domains[0]); i++)
if (!print_addresses(domains[i]))
return 1;
return 0;
}

- 134,834
- 32
- 188
- 245
-
Other than comparing all IP addresses with the default gateway's ip address , what's the best way to find out which interface is "default" for internet connection ? – daisy May 08 '12 at 11:40
-
@warl0ck That can be tricky to do in the general case. Yours would be interesting as a separate Stack Overflow question of its own. – Greg Bacon May 09 '12 at 21:12
Your question might be imprecise but I am not sure why everyone is breaking your chops.
I think you are asking the basics in which case you probably want is getifaddrs. The man page has a little example program.
You can also get similar info using the SIOCGIFCONF option with ioctl(). There is some sample code on here and the web.
If you search around for these and similar terms you will find this question has been asked in various forms before. You have to dig around a bit.
Also note, these will not give you the public facing IP of your network if you are behind NAT.
Another way to do it in C. I do have to say though.... there are so many ways to do it from the shell, what's the point?
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <errno.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
void show_address_info( struct ifaddrs *ifa ){
struct sockaddr_in *s4;
struct sockaddr_in6 *s6;
/* ipv6 addresses have to fit in this buffer */
char buf[64];
if (AF_INET == ifa->ifa_addr->sa_family){
s4 = (struct sockaddr_in *)(ifa->ifa_addr);
if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), buf, sizeof(buf))){
printf("%s: inet_ntop failed!\n", ifa->ifa_name);
} else {
printf("IPv4 addr %s: %s\n", ifa->ifa_name, buf);
}
}
else if (AF_INET6 == ifa->ifa_addr->sa_family) {
s6 = (struct sockaddr_in6 *)(ifa->ifa_addr);
if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s6->sin6_addr), buf, sizeof(buf))) {
printf("%s: inet_ntop failed!\n", ifa->ifa_name);
} else {
printf("IPv6 addr %s: %s\n", ifa->ifa_name, buf);
}
}
}
int main(int argc, char **argv){
struct ifaddrs *myaddrs, *ifa;
int status;
status = getifaddrs(&myaddrs);
if (status != 0){
perror("getifaddrs failed!");
exit(1);
}
for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next){
if (NULL == ifa->ifa_addr){
continue;
}
if ((ifa->ifa_flags & IFF_UP) == 0) {
continue;
}
show_address_info(ifa);
}
freeifaddrs(myaddrs);
return 0;
}

- 161
- 1
-
Spawning a shell is not an option in many environments, such as inside a shared library. If you do fork + exec you may cause atexit handlers for the process your library is linked against to run, which could be disastrous. Plus how do you think those shell utilities are implemented? They are implemented in C. – cmccabe Apr 05 '15 at 20:07
How about you simply cheat and look at the source of /sbin/ifconfig/
? Nothing wrong with standing on the shoulders of other giants...

- 360,940
- 56
- 644
- 725
Not a complete solution yet, but take a look in /proc/net
!
dev
lists the available interface devices by name,route
lists some routes, as doesipv6_route
,arp
lists devices in the actual routing table (does not include localhost).
Not as high-tech as the other solution, but it can be done with simple file reading. Linux specific, though.

- 66,391
- 18
- 125
- 167
You need POSIX function getaddrinfo()
- it returns linked list of all IP addresses.
See man getaddrinfo
for details and examples.

- 34,062
- 14
- 56
- 86
$ sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1 213.xx.xxx.xx 192.168.xx.x 127.0.0.1
And you can put that into popen():
/* not tested */
ph = popen("sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1", "r");
while (fgets(buf, sizeof buf, ph)) {
/* ip address, in nul-terminated string format, is in `buf` */
}
pclose(ph);

- 106,608
- 13
- 126
- 198
-
2-1 for using shell commands in C code. IMO this shouldn't be advised. A solution using the actual language and system/library calls is much better. Especially for a beginner question like this. – Steve Lazaridis Jan 07 '10 at 19:50
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
/*
* Who sez?
* http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/
*/
int main(int argc, char *argv[])
{
int status;
const char * const cmd = /* die from END is too chatty */
"/sbin/ifconfig -a | \
perl -lne \
'print $1 if /inet6? addr:\\s*(\\S+)/; \
END { $. > 0 or \
warn(\"no output from ifconfig\\n\"), \
exit 1; }'";
status = system(cmd);
if (status < 0) {
perror("system");
return 1;
}
else if (status != 0) {
const char *extra;
status = WEXITSTATUS(status);
extra = status == 127 ? " (is /bin/sh ok?)" : "";
fprintf(stderr, "%s: command failed with status %d%s\n",
argv[0], status, extra);
}
return 0;
}

- 134,834
- 32
- 188
- 245
-
2Using C to write Perl... That's um... cheating :P. And totally nonportable. – Macha Jan 07 '10 at 16:05
-
3
-
@Macha Which Linux distribution does not ship with perl? I also gave an all-C answer. http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/ – Greg Bacon Jan 07 '10 at 16:53
-
1+2 for more conciseness and maintainability than the accepted answer. – Christopher Bottoms Jan 29 '10 at 13:29
-