Wie kommt man an die eigene IP(C Sockets)?

Ich würde gerne irgendwie meine eigene Ip auslesen können. Leider weiß ich einfach nicht wie. Es gäbe da die möglichkeit mit uname() in verbindung mit gethostbyname(), doch das funktioniert nicht wirklich. Es müsste doch eine einfache(vielleicht auch eine elegantere) Lösung geben, oder?
 
Es gibt eine andere Moeglichkeit, dies ueber die Funktion ioctl() zu realisieren..ist aber im Gegensatz zu uname()/gethostbyname sehr aufwendig.

Also: mit uname holst Du Dir den hostnamen und mit gethostbyname alle zugehoerigen IP adressen...thats the way...

Eine schlichtere moeglichkeit ist mir nicht bekannt, wenn Du eine findest poste die mal bitte :)

:wq!
 
Tja, die Methode mit uname() hab ich schon mal probiert funktioniert aber nicht. Ich hab eine dynamische Ip und deswegen steht mein Hostname nicht in der /etc/hosts. Und somit bekomm ich mit uname() nur meinen "Rechnernamen" und nicht den richtigen Hostnamen. Wie funktioniert die Methode mit ioctl() ungefähr? Ich würd diese gerne mal ausprobieren, denn zur Zeit bin ich wegen diesem Problem schon richtig verzweifelt.
 
Mein Programm soll sowieso als erstes einen Ping versenden und nun hol ich mir meine Ip aus der Echo-Reply-Msg raus. struct iphdr ip->daddr; Schmutzig, aber in der Not frißt der Teufel Fliegen*g.
Fürs Erste Funktioniert jetzt mein Programm, ich werd mir jetzt aber trotzdem noch die Methode mit der ioctl()-Funktion genauer ansehen.

PS: Statt uname() könnte man auch gethostname(char *name, size_t namelen) verwenden. Leider funzt das bei mir auch nicht. Bekomm da wieder "nur" meinen "Heimnetzwerkhostnamen" raus.
 
" PS: Statt uname() könnte man auch gethostname(char *name, size_t "namelen) verwenden. Leider funzt das bei mir auch nicht. Bekomm da wieder "nur" meinen "Heimnetzwerkhostnamen" raus."

Zur ermittlung der IP brauchst Du erst uname() und dann gethostbyname().

:wq!
 
hier eine Loesung mit ioctl() (thx wulf)

#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <net/if.h>

unsigned long get_ifaddr(char *ifname)
{
int s;
struct ifreq ifr;
struct sockaddr_in sa;

strncpy(ifr.ifr_name,ifname,IFNAMSIZ);
s=socket(AF_INET,SOCK_DGRAM,0);
if(ioctl(s,SIOCGIFADDR,&ifr))
{
close(s);
return(0);
}
close(s);
memcpy(&sa,&ifr.ifr_addr,16);
return(sa.sin_addr.s_addr);
}

int main(int argc, char **argv)
{
struct in_addr in;

if(argc!=2) {
fprintf(stderr,"Usage: %s interface\n",argv[0]);
return(1);
}
if((in.s_addr=get_ifaddr(argv[1]))==0) {
return(1);
}
printf("%s\n",inet_ntoa(in));
return(0);
}

Als Argument musst du das netz interface angeben bei mit dann:

programm ppp0

fuer lokale ips

programm eth0 etc..

btw...das dingen wird imo definitiv nicht unter win laufen..

:wq!
 
Zur ermittlung der IP brauchst Du erst uname() und dann gethostbyname().
...oder gethostname() und dann gethostbyname() wie ich schon sagte.

Danke für den Code. Vielleicht kann ich ihn noch erweitern, damit man das interface nicht angeben muß aber kann. Ich hätte dazu bereits eine Idee....
 
Hat irgendjemand eine Idee wie man Routing-Sockets für Linux programmiert?
In meiner Lektüre wird erklärt, dass man, um die Makros RTA_MAX oder RTM_GET verwenden zu können, die Header-Datei "net/if_dl.h" einfügen muß? Leider gibt es in meinem System(Debian woody) diese Datei nicht.
Compiler: gcc 2.95.4
 
Zurück
Oben