2010-02-17 5 views

Répondre

65

Essayez ceci:

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> /* for strncpy */ 

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <netinet/in.h> 
#include <net/if.h> 
#include <arpa/inet.h> 

int 
main() 
{ 
int fd; 
struct ifreq ifr; 

fd = socket(AF_INET, SOCK_DGRAM, 0); 

/* I want to get an IPv4 IP address */ 
ifr.ifr_addr.sa_family = AF_INET; 

/* I want IP address attached to "eth0" */ 
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); 

ioctl(fd, SIOCGIFADDR, &ifr); 

close(fd); 

/* display result */ 
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 

return 0; 
} 

L'exemple de code est tiré de here.

+1

pourquoi il y a un défaut de segmentation? – user138126

+1

Donne un défaut de segmentation –

+0

'#include ' est manquant pour 'close()' – Angs

33

En plus de la méthode ioctl(), Filip a démontré que vous pouvez utiliser getifaddrs(). Il y a un exemple de programme en bas de la page de manuel.

+1

getifaddrs semble très complet. Les autres méthodes ne donneront que la première ou la première adresse par interface. – MarkR

+1

Oh génial, je ne savais jamais à ce sujet! –

+0

Je n'ai aucune connexion sur eth0, si j'utilise l'autre méthode, elle sort 128.226.115.183 ce qui est faux. Cependant, cette méthode montre qu'il n'y a pas de connexion sur eth0 qui fournit une sortie fiable. – Angs

18

Si vous êtes à la recherche d'une adresse (IPv4) de l'interface spécifique dire wlan0 alors essayer ce code qui utilise getifaddrs():

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
int main(int argc, char *argv[]) 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) 
    { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    { 
     if (ifa->ifa_addr == NULL) 
      continue; 

     s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 

     if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET)) 
     { 
      if (s != 0) 
      { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("\tInterface : <%s>\n",ifa->ifa_name); 
      printf("\t Address : <%s>\n", host); 
     } 
    } 

    freeifaddrs(ifaddr); 
    exit(EXIT_SUCCESS); 
} 

Vous pouvez remplacer wlan0 avec eth0 pour ethernet et à pour le bouclage local. La structure et les explications détaillées des structures de données utilisées peuvent être trouvées here.

Pour en savoir plus sur la liste chaînée en C, ce page sera un bon point de départ.

+0

@nhahtdh: on dirait que vous avez édité le morceau de code. serait bien si vous commentez quel changement vous avez fait !! – sjsam

+0

Vérifier la révision: Je ne réindique que votre code. – nhahtdh

+0

C'est génial !! Cheerz cher .. – sjsam

1

Mes 2 cents: le même code fonctionne même si iOS:

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 



#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    showIP(); 
} 



void showIP() 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) 
    { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    { 
     if (ifa->ifa_addr == NULL) 
      continue; 

     s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 

     if(/*(strcmp(ifa->ifa_name,"wlan0")==0)&&(*/ ifa->ifa_addr->sa_family==AF_INET) //) 
     { 
      if (s != 0) 
      { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("\tInterface : <%s>\n",ifa->ifa_name); 
      printf("\t Address : <%s>\n", host); 
     } 
    } 

    freeifaddrs(ifaddr); 
} 


@end 

J'ai simplement retiré le test contre wlan0 pour voir les données. ps Vous pouvez supprimer "family"