Verarbeitung mehrerer IP Adressen am selben Rechner



  • Hallo,

    Ich habe ein kleines Problem und hoffe ihr könnt mir weiterhelfen. Ich habe eine Debian Maschine mit 2 Netzwerkkarten. Jede davon hat im Moment noch ihre eigene IP, später sollen dann 2 verschiedene IP Adressen einem einzigen Interface zugeordnet werden, also 4 insgesamt.
    Ich möchte in meinem C Programm dem user alle verfügbaren IP Adressen ausgeben und jeweils in einen String schreiben lassen.
    Hat jemand eine Idee oder einen Tipp wie sich das am besten bewerkstelligen lässt?

    Grüße
    Christian



  • schau dir mal die funktion netdevice an und im speziellen die funktion SIOCGIFCONF von netdevice. das ist, was du brauchst.



  • Hi,

    erstmal Danke für die schnelle Antwort. Ich habe jetzt mal danach gesucht, habe aber netdevice bis jetzt nur als ziemlich unübersichtliche Header Datei vorgefunden.
    Könntest du bitte kurz näher erklären wie der Einsatz dieser beiden Funktionen genau ablaufen soll?
    Ich habe mir das eigentlich gar nicht so schwer vorgestellt, ich meine in der shell geht das ja auch wenn man sich mit ifconfig, grep, awk das passende Ergebnis zusammenbastelt. Ich habe schon überlegt das auch so zu nutzen, also vom C Code aus über einen system() Befehl, wäre aber sicherlich nicht die sauberste Variante.



  • netdevice ist soweit ich weiss linuxspezifisch. Ich würde eher getaddrinfo verwenden.



  • infos zu netdevice gibt dir man netdevice. getaddrinfo hilft dir überhaupt nicht... so wie ich das verstanden habe, willst du alle ip adressen, die an einem interface konfiguriert wurden, auslesen. getaddrinfo gibt dir nur alle ip adressen zu einem hostname an. du brauchst netdevice. eine portable methode kenne ich leider nicht. verwendest du linux?



  • Ja, ich programmiere unter Linux. Ich möchte einfach alle an der Maschine verfügbaren IP Adressen ausgeben lassen. Am besten noch verknüpft welches Interface mit welchen bzw. mit wie vielen verknüpft ist. Aber ich denke das impliziert das was 'namenlos' zuletzt beschrieben hat.
    Ich schaue mir jetzt mal die manpages an, vielleicht bin ich danach schlauer...
    Danke noch mal!



  • Hi,

    Habe das Ganze jetzt folgendermaßen gelöst:

    void listdevices(void)
    {
    struct ifaddrs *ifap = (void *)0;
    struct ifaddrs *ifnr = (void *)0;
    struct sockaddr *addr = (void *)0;
    struct sockaddr_in *addr_in = (void *)0;
    int res = getifaddrs(&ifap);
    int a, b, c, d;

    if (0!=res)
    {
    printf("%s\n",strerror(errno));
    exit(-1);
    }

    ifnr = ifap;

    while ((void *)0 != ifnr)
    {
    addr = ifnr->ifa_addr;

    if (AF_INET == addr->sa_family)
    {
    addr_in = (struct sockaddr_in *)ifnr->ifa_addr;

    a = (htonl(addr_in->sin_addr.s_addr) >> 0x18) &0xFF;
    b = (htonl(addr_in->sin_addr.s_addr) >> 0x10) &0xFF;
    c = (htonl(addr_in->sin_addr.s_addr) >> 0x8 ) &0xFF;
    d = (htonl(addr_in->sin_addr.s_addr) & 0xFF);

    printf("%s :\t%u.%u.%u.%u\n", ifnr->ifa_name, a, b, c, d);
    }

    ifnr = ifnr->ifa_next;
    }
    freeifaddrs( ifap );
    }

    Erfüllt seinen Zweck, leider kann ich hier nicht testen ob es dann auch mit mehreren Netzwerkkarten so funktioniert.

    Ich habe noch eine andere kleine Frage, vielleicht weiß ja jemand Rat. Ich möchte im selben Programm 3 vom user eingegebene values an einen system() Befehl weiterleiten, ein String und 2 int werte.
    Das ganze soll dann so in der shell ausgeführt werden:
    ./programm "string" "int1" "int2"

    Kennt jemand die Syntax wie ich das alles in einen system Befehl packen kann?
    Geht das überhaupt?

    Grüße
    Chris



  • Shapeshifter schrieb:

    Ich habe noch eine andere kleine Frage, vielleicht weiß ja jemand Rat. Ich möchte im selben Programm 3 vom user eingegebene values an einen system() Befehl weiterleiten, ein String und 2 int werte.
    Das ganze soll dann so in der shell ausgeführt werden:
    ./programm "string" "int1" "int2"

    Kennt jemand die Syntax wie ich das alles in einen system Befehl packen kann?
    Geht das überhaupt?

    Das ist doch ganz einfach:

    char buffer[200];
    
    sprintf(buffer, "%s %s %d %d", befehl, string, zahl1, zahl2);
    system(buffer);
    


  • Funktioniert, danke!
    Ist um einiges kompakter als mit strcat.


Anmelden zum Antworten