Voici un exemple de programme en C qui permet de récupérer différents paramètres réseau, ce n’est pas encore l’idéal mais ça a le mérite de marcher, d’être simple et assez lisible.

Pour cela je me suis inspiré de ce que me donne un strace ifconfig pour les adresses IP, Mac, le masque réseau ainsi que le broadcast.

Pour la passerelle (ou gateway) j’ai utilisé le retour de la commande netstat -rn, qui est équivalent à la commande route -en, puis grep ^0.0.0.0 qui permet de sélectionner la ligne commençant par 0.0.0.0 (qui est la route par défaut), et enfin awk -F ' ' '{print $2}' permet d’isoler le résultat avec le séparateur espace et de prendre le second résultat.
[c]
#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <net/route.h>
#include <netinet/in.h>
#include <sys/ioctl.h>

int main(int argc, char* argv[])
{
int socketd;
char IPAddr[16];
char Netmask[16];
char Broadcast[16];
char MacAddr[13];
char Route[16];
struct ifreq ifr;

socketd = socket(AF_INET, SOCK_DGRAM, 0);
if (socketd <= 0)
{
perror("socket");
return -1;
}

IPAddr[0]=0;
Netmask[0]=0;
Broadcast[0]=0;
MacAddr[0]=0;
Route[0]=0;

strcpy(ifr.ifr_name, "eth0");

if (0 == ioctl(socketd, SIOCGIFADDR, &ifr))
{
strcpy(IPAddr,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}

if (0 == ioctl(socketd, SIOCGIFNETMASK, &ifr))
{
strcpy(Netmask,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
}

if (0 == ioctl(socketd, SIOCGIFBRDADDR, &ifr))
{
strcpy(Broadcast,(char*) inet_ntoa(((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
}

if (0 == ioctl(socketd, SIOCGIFHWADDR, &ifr))
{
sprintf(MacAddr,"%02X%02X%02X%02X%02X%02X",(unsigned char)ifr.ifr_hwaddr.sa_data[0],(unsigned char)ifr.ifr_hwaddr.sa_data[1]
,(unsigned char)ifr.ifr_hwaddr.sa_data[2],(unsigned char)ifr.ifr_hwaddr.sa_data[3]
,(unsigned char)ifr.ifr_hwaddr.sa_data[4],(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
}

close(socketd);

FILE *fic;

fic = popen("netstat -rn |grep ^0.0.0.0|awk -F ‘ ‘ ‘{print $2}’", "r");
if(fic == NULL){
printf("Impossible d’ouvrir le tube\n");
}else
{
fgets(Route, 16, fic);
pclose(fic);
}
printf("IP: %s\nNetmask: %s\nBroadcast: %s\nRoute: %s\nMac: %s\n", IPAddr, Netmask, Broadcast, Route, MacAddr);

}
[/c]