Für eine Kommunikation zwischen zwei Hosts, muss ich die IP-Adresse meines Hosts an die andere Seite senden. Das Problem ist, dass, wenn ich meine IP-Adresse anfrage, es sein kann, dass ich meine lokalen Loopback-IP-Adressen (127.x.x.x), nicht die Netzwerk (Ethernet) IP-Adresse zurückbekomme.Wie bekomme ich meine nicht-Loopback-Netzwerk-IP-Adresse in C?
Ich verwende den folgenden Code ein:
char myhostname[32];
gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);
if((my_ip % 256) == 127) {
/* Wrong IP adress as it's 127.x.x.x */
printf("Error, local IP address!");
return;
}
Der einzige Weg, um es zu lösen ist mein Hostname in/etc/hosts, um sicherzustellen, hinter der realen Netzwerk-Adresse, nicht der lokale Loopback (der Standard für zB Ubuntu).
Gibt es eine Möglichkeit, dies zu lösen, ohne sich auf den Inhalt von/etc/hosts zu verlassen?
Edit: änderte ich den obigen Code, so dass es die Verwendung von getaddrinfo macht, aber ich habe immer noch die Loopback-Device Nummer (127.0,0,1) anstelle der realen IP-Adresse zurück:
struct addrinfo hint = {0};
struct addrinfo *aip = NULL;
unsigned ip = 0;
struct sockaddr_in *sinp = NULL;
hint.ai_family = AF_INET; /* IPv4 */
hint.ai_socktype = SOCK_STREAM;
if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
return 0;
}
sinp = (struct sockaddr_in *) aip->ai_addr;
ip = *(unsigned *) &sinp->sin_addr;
(ich habe mit den drei SOCK_STREAM, SOCK_DGRAM und SOCK_RAW eine Liste von 3 addrinfo die zurück zu bekommen, aber der Hinweis, dass verhindert)
Also meine Frage steht immer noch ...
gethostbyname ist seit vielen Jahren veraltet (einer der Gründe dafür, dass es nur mit einer Adressfamilie funktioniert). Wie von qrdl erwähnt, sollten Sie getaddrinfo verwenden – bortzmeyer
Ok, danke für die Info. Dieser Originalcode ist 12+ Jahre alt. – Roalt