Wie kann ich die IPv4 Adresse einer Schnittstelle unter Linux von C-Code?Get IP-Adresse einer Schnittstelle unter Linux
Zum Beispiel möchte ich die IP-Adresse (falls vorhanden) eth0 zugewiesen bekommen.
Wie kann ich die IPv4 Adresse einer Schnittstelle unter Linux von C-Code?Get IP-Adresse einer Schnittstelle unter Linux
Zum Beispiel möchte ich die IP-Adresse (falls vorhanden) eth0 zugewiesen bekommen.
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.
Zusätzlich zur ioctl() -Methode demonstrierte Filip, dass Sie getifaddrs() verwenden können. Es gibt ein Beispielprogramm am unteren Rand der Manpage.
Getifaddrs scheint sehr umfassend. Andere Methoden geben nur die primäre oder die erste Adresse pro Schnittstelle an. – MarkR
Oh großartig, wusste nie darüber! –
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
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.
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
Warum gibt es einen Segmentierungsfehler? – user138126
Gibt Segmentierungsfehler –
'#include' fehlt für die 'close()' –
Angs