kenshiro1980: Oui c´est normal, ça renvoit l´adresse de la socket, alors que tu voulais l´adresse ethernet. Désolé de pas avoir répondu plus tot, mais j´était entrain de faire mumuse avec l´api de Zend
J´ai quand même repris l´idée d´ackeur pour écrire ceci:
- include < stdio.h>
- include < net/if.h>
- include < netinet/if_ether.h>
- include < netinet/in.h>
- include < sys/ioctl.h>
void net_addr ( char *interf)
{
int sock;
struct ifreq irs;
struct sockaddr_in ias;
if ( (sock = socket ( PF_INET, SOCK_DGRAM, 0)) < 0)
{
/ * erreur socket */
}
memset ( &, 0, sizeof ( struct ifreq));
/ * initialisation de la zone mémoire-> 000000000000 */
strncpy ( irs.ifr_name, interf, sizeof ( irs.ifr_name));
/ * copie partielle du nom de l´interface dans la struct ifreq */
if ( ioctl ( sock, SIOCGIFADDR, &) < 0)
{
/ * erreur ioctl */
}
close ( sock);
memcpy ( &, &.ifr_addr, sizeof ( struct ifreq));
/ * copie l´adresse ( uli) dans la struct sockaddr pour _ntoa */
printf ( "%s\n", inet_ntoa ( ias.sin_addr));
/ * retourne 0.0.0.0 si pas d´interface valide */
}
int main ( )
{
net_addr("ppp0");
/ * retourne l´adresse tcp */
net_addr("lo");
/ * retourne l´adresse locale */
net_addr("eth0");
/ * retourne l´adresse de l´interface ethernet */
return 0;
}
-> pas besoin d´être root là 