interne IP adresse von host auslesen (ohne socket)

zoidberger

Mitglied
Hey Leute!

Ich bin etwas am verzweifeln, da ich hier ein kleines problem habe..
Ich programmiere gerade unter linux.. das programm soll später auf einem linux server (aber vlt. auch mal auf einem win server) laufen. Es soll aber nur laufen, wenn es auf einem bestimmten server liegt.
Also soll beim start des programms geprüft werden, welche (interne) IP der host gerade hat.
Ich möchte dafür nicht unbedingt extra einen socket auf machen... wenn das aber im endeffekt doch die einfachste lösung ist, werde ich das wohl tun.
(dass ich keine system calls verwenden will ist glaube ich logisch wegen linux <-> win)

Bislang habe ich es mit
Code:
gethostname
und
Code:
gethostbyname
versucht. Da bekomme ich auch den korrekten host namen, allerdings immer nur die loopback adresse 127.0.0.1. Das nützt mir nicht viel..

Auf einem der server habe ich 4 interfaces.
lo, eth1, eth0 und bond0.
Mich interessiert die IP von bond0.

Gibt es eine Möglichkeit das ganze schnell und einfach mit
Code:
gethostbyname
zu lösen oder werde ich es mit einem socket und dem veralteten
Code:
SIOCGIFCONF
versuchen müssen?

Es wäre schön, wenn mir jemand einen Rat hätte.

Für den Fall dass es jemand interessiert, hier den gethostbyname code:

Code:
string returnVal;
	char   temp[255];

	gethostname(temp,sizeof(temp));

	const hostent* host_info = NULL;
	struct in_addr addr;
        host_info = gethostbyname(temp);

	returnVal = temp;
	cout << returnVal << endl;

	int i=0;
        while (host_info->h_addr_list[i])
        {
                  addr.s_addr = *((long*)host_info->h_addr_list[i++]);
                  cout << inet_ntoa(addr) << endl;
        };

Vielen Dank im Vorraus!
 
Hi.
(dass ich keine system calls verwenden will ist glaube ich logisch wegen linux <-> win)
Deine Aufgabe ist allerdings ziemlich systemabhängig, du wirst also nicht darum herumkommen.
Bislang habe ich es mit
Code:
gethostname
und
Code:
gethostbyname
versucht. Da bekomme ich auch den korrekten host namen, allerdings immer nur die loopback adresse 127.0.0.1.
Das ist klar. DNS Anfrage -> /etc/hosts -> localhost == 127.0.0.1 / ::1
Auf einem der server habe ich 4 interfaces.
lo, eth1, eth0 und bond0.
Mich interessiert die IP von bond0.

Gibt es eine Möglichkeit das ganze schnell und einfach mit
Code:
gethostbyname
zu lösen
Nein. (es sei denn du stellst localhost in der /etc/hosts auf die gewünschte IP um... :eek:)

Du müßtest alle Interfaces enumerieren und prüfen ob ein Interface die bestimmte IP Adresse besitzt.

Dazu könntest du z.B. Pcap bzw. WinPcap verwenden:

http://www.winpcap.org/docs/docs_412/html/group__wpcap__tut1.html

Gruß
 
Okay, dann ändere ich jetzt eben die localhost adresse der server.... moment... ;)
Ich habe mich jetzt mal in pcap eingelesen und es gefällt mir was ich da lese!
Da ich nur die lokalen devices brauche, habe ich es jetzt mit int
Code:
pcap_findalldevs( pcap_if_t ** alldevsp, char * errbuf )
versucht..
das merkwürdige ist, dass ich "0" als returnvalue bekomme... also alles geklappt haben sollte, aber alldevsp ist dennoch leer..

Eine Idee?

Ich habe Version 1.1.1 von der libpcap. Die pcap/pcap.h inkludiert und die libpcap.a statisch eingebunden.
Eigentlich müsste alles passen?!
 
Zuletzt bearbeitet:
okay.. ja, ich muss root sein. God damnit..
naja, dann kann ich diese Lösung vergessen. Die applikation wird auf den Server niemals als root ausgeführt. Okay, dann mach ichs eben doch mit ioctl und nem socket :-/
Warum kann denn nicht mal was einfach so klappen ohne stundenlang irgendwelche bibliotheken zu suchen und rumzuprobieren ;)

//Edit: also ja, es hat funktioniert, als ich es als root ausgeführt hab!
 
falls es jemanden interessiert:

Code:
    // get all interfaces
    struct ifreq   buffer[32];
    struct ifconf  intfc;
    struct ifreq  *pIntfc;
    int            i, fd, num_intfc;

    intfc.ifc_len = sizeof(buffer);
    intfc.ifc_buf = (char*) buffer;

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket() failed");
        return 1;
    }

    if (ioctl(fd, SIOCGIFCONF, &intfc) < 0)
    {
        perror("ioctl SIOCGIFCONF failed");
        return 1;
    }

    // compare ip_list with ips of host
    pIntfc    = intfc.ifc_req;
    num_intfc = intfc.ifc_len / sizeof(struct ifreq);    
    bool start_allowed = false;
    for (i = 0; i < num_intfc; i++)
    {
        struct ifreq *item = &(pIntfc[i]);
        //cout << "Interface # " << i << " -> " << item->ifr_name << ": IP " << inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)
        if (iplist.count(inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)->sin_addr)) != 0)
        {
                start_allowed = true;
                break;
        }
    }

    // if current host IP is not in the list of allowed IPs,
    // dont start the program.
    if (!start_allowed)
        exit(1);

iplist ist ein stl set<string>..
eingebunden hab ich die header files, die eben für AF_INET usw. benötigt sind.


danke für eure hilfe ;)
 
Zurück