2010-02-17 16 views

Antwort

65

Versuchen Sie folgendes:

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

Das Codebeispiel aus here genommen wird.

+1

Warum gibt es einen Segmentierungsfehler? – user138126

+1

Gibt Segmentierungsfehler –

+0

'#include ' fehlt für die 'close()' – Angs

33

Zusätzlich zur ioctl() -Methode demonstrierte Filip, dass Sie getifaddrs() verwenden können. Es gibt ein Beispielprogramm am unteren Rand der Manpage.

+1

Getifaddrs scheint sehr umfassend. Andere Methoden geben nur die primäre oder die erste Adresse pro Schnittstelle an. – MarkR

+1

Oh großartig, wusste nie darüber! –

+0

Ich habe keine Verbindung auf eth0, wenn ich die andere Methode verwende, gibt es 128.226.115.183 aus, was falsch ist. Diese Methode zeigt jedoch, dass es auf eth0 keine Verbindung gibt, die eine zuverlässige Ausgabe liefert. – Angs

18

Wenn Sie sich für eine Adresse (IPv4) der spezifischen Schnittstelle sagen wlan0 dann versuchen, diesen Code, der getifaddrs() verwendet suchen: für

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

Sie können ersetzen wlan0 mit eth0 Ethernet und lo für lokale Loopback.

Die Struktur und detaillierte Erklärungen der verwendeten Datenstrukturen konnten gefunden werden here.

Um mehr über die verknüpfte Liste in C zu erfahren, wird diese page ein guter Ausgangspunkt sein.

+0

@nhahtdh: sehen Sie aus, als ob Sie das Stück Code bearbeitet haben. wäre gut, wenn Sie kommentieren, was für eine Veränderung Sie gemacht haben !! – sjsam

+0

Überprüfen Sie die Revision: Ich reinige nur Ihren Code. – nhahtdh

+0

Das ist brilliant !! Cheerz Schatz .. – sjsam

1

Meine 2 Cent: der gleiche Code funktioniert auch, wenn 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 

Ich habe einfach den Test gegen wlan0 Daten zu sehen. ps Sie können "Familie" entfernen