tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von deepthroat
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
216
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zoidberger
    zoidberger zoidberger ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    45
    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 :
    1
    
    gethostname
    und
    Code :
    1
    
    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 :
    1
    
    gethostbyname
    zu lösen oder werde ich es mit einem socket und dem veralteten
    Code :
    1
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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!
     
    Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von zoidberger Beitrag anzeigen
    (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.
    Zitat Zitat von zoidberger Beitrag anzeigen
    Bislang habe ich es mit
    Code :
    1
    
    gethostname
    und
    Code :
    1
    
    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
    Zitat Zitat von zoidberger Beitrag anzeigen
    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 :
    1
    
    gethostbyname
    zu lösen
    Nein. (es sei denn du stellst localhost in der /etc/hosts auf die gewünschte IP um... )

    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...cap__tut1.html

    Gruß
    zoidberger bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von zoidberger
    zoidberger zoidberger ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    45
    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 :
    1
    
    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?!
    Geändert von zoidberger (18.08.11 um 14:57 Uhr)
     
    Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von zoidberger Beitrag anzeigen
    das merkwürdige ist, dass ich "0" als returnvalue bekomme... also alles geklappt haben sollte, aber alldevsp ist dennoch leer..
    Kann es sein, das du es als nicht-root versucht hast?

    Gruß
    zoidberger bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von zoidberger
    zoidberger zoidberger ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    45
    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!
     
    Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !

  6. #6
    Avatar von zoidberger
    zoidberger zoidberger ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    45
    falls es jemanden interessiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
        // 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
     
    Wer im Steinhaus sitzt, sollte nicht mit Gläsern werfen !

Ähnliche Themen

  1. Interne Php-Datei auslesen
    Von Vousak im Forum PHP
    Antworten: 4
    Letzter Beitrag: 23.01.11, 18:57
  2. Antworten: 3
    Letzter Beitrag: 11.11.09, 12:49
  3. Ersatz für Proxy / interne "Host-Umleitung"
    Von fanste im Forum Linux & Unix
    Antworten: 5
    Letzter Beitrag: 07.07.09, 16:40
  4. Antworten: 0
    Letzter Beitrag: 18.04.08, 12:47
  5. IP und Host - Adresse
    Von Cusco im Forum PHP
    Antworten: 5
    Letzter Beitrag: 19.11.07, 17:09