GNU/Linux >> Linux Esercitazione >  >> Linux

Ottieni l'indirizzo IP di un'interfaccia su Linux

Se stai cercando un indirizzo (IPv4) dell'interfaccia specifica, dì wlan0 quindi prova questo codice che utilizza getifaddrs():

#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
    struct ifaddrs *ifaddr, *ifa;
    int family, s;
    char host[NI_MAXHOST];

    if (getifaddrs(&ifaddr) == -1) 
    {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }


    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
    {
        if (ifa->ifa_addr == NULL)
            continue;  

        s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

        if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET))
        {
            if (s != 0)
            {
                printf("getnameinfo() failed: %s\n", gai_strerror(s));
                exit(EXIT_FAILURE);
            }
            printf("\tInterface : <%s>\n",ifa->ifa_name );
            printf("\t  Address : <%s>\n", host); 
        }
    }

    freeifaddrs(ifaddr);
    exit(EXIT_SUCCESS);
}

Puoi sostituire wlan0 con eth0 per ethernet e lo per il loopback locale.

La struttura e le spiegazioni dettagliate delle strutture dati utilizzate possono essere trovate qui.

Per saperne di più sulla lista collegata in C questa pagina sarà un buon punto di partenza.


Oltre al metodo ioctl(), Filip ha dimostrato che puoi usare getifaddrs(). C'è un programma di esempio in fondo alla pagina man.


Prova questo:

#include <stdio.h>
#include <unistd.h>
#include <string.h> /* for strncpy */

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>

int
main()
{
 int fd;
 struct ifreq ifr;

 fd = socket(AF_INET, SOCK_DGRAM, 0);

 /* I want to get an IPv4 IP address */
 ifr.ifr_addr.sa_family = AF_INET;

 /* I want IP address attached to "eth0" */
 strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);

 ioctl(fd, SIOCGIFADDR, &ifr);

 close(fd);

 /* display result */
 printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));

 return 0;
}

L'esempio di codice è preso da qui.


Linux
  1. Linux:come ottenere l'indirizzo IPv4 per un'interfaccia da /proc?

  2. Linux:il modo portatile per ottenere l'indirizzo di origine del percorso predefinito?

  3. Python:ottieni il gateway predefinito per un'interfaccia locale/indirizzo IP in Linux

  4. Come ottenere il numero di CPU in Linux usando C?

  5. Linux ottiene tutti i nomi delle interfacce di rete

Come trovare l'indirizzo IP in Linux

3 modi per configurare un'interfaccia di rete in Linux

Come modificare l'indirizzo IP su Linux

Come ottenere il tuo indirizzo IP su Linux

Ottieni l'indirizzo IP dei siti

Ottieni un indirizzo IP su Linux:scopri i molti modi