c++ compile - Come rilevare la modifica dell'indirizzo IP in modo programmatico in Linux?




4 Answers

In C, per ottenere l'IP corrente uso:

    int s;
    struct ifreq ifr = {};

    s = socket(PF_INET, SOCK_DGRAM, 0);

    strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));

    if (ioctl(s, SIOCGIFADDR, &ifr) >= 0)
        printf("%s\n",
          inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));

Sostituisci "eth0" con l'interfaccia che stai guardando. Tutto quello che devi fare ora è un sondaggio per una modifica.

compiling file

C'è un modo per rilevare le modifiche agli indirizzi IP sulla macchina locale in Linux a livello di programmazione usando C ++?




Non è facile in alcun modo. Ogni distribuzione linux utilizza diverse posizioni per archiviare gli indirizzi IP, ecc. (Più variazioni se si considerano altre varianti UNIX). Ad esempio, puoi usare /sbin/ifconfig per ottenere gli indirizzi IP delle interfacce, ma non puoi nemmeno essere sicuro se lo troverai in questo posto, o del tutto, ecc.

Inoltre, dato che hai quell'eseguibile, devi impostare un thread chiamandolo per ottenere i dati con un dato periodo (diciamo 5 secondi) e interpretare l'output. Può variare, ad esempio, se hai ponti, ecc. Ecc. Cioè, non è facile.

Una soluzione che mi viene in mente è, se hai l'opportunità di usare GNOME o qualche altra distribuzione diffusa come KDE, puoi fare affidamento sui messaggi / informazioni che danno. Ad esempio, NetworkManager emette un segnale sul bus standard DBUS quando un dispositivo cambia. Devi implementare un ascoltatore per quel segnale. Informazioni qui (non funziona in questo momento, quindi ecco una cache ). Notare i diversi messaggi quando viene aggiunta una nuova interfaccia o quando uno di questi cambia l'indirizzo IP. Questo è il modo migliore in cui posso pensare adesso.




Se iproute2 è installato e sei su un kernel 2.6,

/sbin/ip monitor

Emetterà le modifiche nello stato dell'interfaccia locale e gli indirizzi nello stdout. Il tuo programma può leggerlo.

Si potrebbe anche usare lo stesso meccanismo di basso livello di quello che fa lo strumento iproute2 (penso che sia un socket netlink).




Un modo sarebbe quello di scrivere un lavoro cron che contiene una chiamata a una famiglia di funzioni della libreria gethost. Se si utilizza gethostbyname () è possibile confrontare i valori di ritorno di h_addr_list. Vedi man gethostbyname.

Se vuoi farlo dal tuo programma, genera un pthread che fa la stessa cosa, poi dorme per qualche periodo di tempo arbitrario.




Related

c++ linux

Tags

c++   linux