2010-02-17 16 views

Respuesta

65

Prueba esto:

#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; 
} 

El ejemplo de código se toma de here.

+1

¿por qué hay una falla de segmentación? – user138126

+1

Da error de segmentación –

+0

'#include ' falta para 'close()' – Angs

33

Además del método ioctl() Filip demostró que puede usar getifaddrs(). Hay un programa de ejemplo en la parte inferior de la página de manual.

+1

getifaddrs parece muy completo. Otros métodos solo darán la dirección principal o primera por interfaz. – MarkR

+1

¡Oh, increíble, nunca lo supe! –

+0

No tengo ninguna conexión en eth0, si utilizo el otro método, muestra 128.226.115.183 que es incorrecto. Sin embargo, este método muestra que no hay conexión en eth0 que proporcione una salida confiable – Angs

18

Si usted está buscando una dirección (IPv4) de la interfaz específica dicen wlan0 continuación tratar este código que utiliza 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); 
} 

Puede reemplazar wlan0 con eth0 para ethernet y lo para loopback local.

La estructura y las explicaciones detalladas de las estructuras de datos utilizadas se pueden encontrar en here.

Para saber más sobre la lista de enlaces en C, este page será un buen punto de partida.

+0

@nhahtdh: parece que ha editado el fragmento de código. sería bueno si comenta qué cambio ha realizado !! – sjsam

+0

Verifique la revisión: solo reinicio su código. – nhahtdh

+0

¡¡Eso es genial !! Cheerz querido ... – sjsam

1

Mis 2 centavos: el mismo código funciona incluso si el 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 

simplemente quitan la prueba contra wlan0 para ver los datos. ps Puede eliminar "familia"

Cuestiones relacionadas