GNU/Linux >> Belajar Linux >  >> Linux

Dapatkan alamat IP dari sebuah antarmuka di Linux

Jika Anda mencari alamat (IPv4) dari antarmuka tertentu, ucapkan wlan0 lalu coba kode ini yang menggunakan 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);
}

Anda dapat mengganti wlan0 dengan eth0 untuk ethernet dan lo untuk loopback lokal.

Struktur dan penjelasan mendetail tentang struktur data yang digunakan dapat ditemukan di sini.

Untuk mengetahui lebih lanjut tentang daftar tertaut di C, halaman ini akan menjadi titik awal yang baik.


Selain metode ioctl() yang diperagakan Filip, Anda dapat menggunakan getifaddrs(). Ada contoh program di bagian bawah halaman manual.


Coba ini:

#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;
}

Contoh kode diambil dari sini.


Linux
  1. Python:dapatkan gateway default untuk antarmuka/alamat ip lokal di linux

  2. C++ Linux:Dapatkan kecepatan refresh monitor

  3. Dapatkan alamat MAC menggunakan skrip shell

  1. Linux – Bagaimana Cara Mendapatkan Alamat IPv4 Untuk Antarmuka Dari /proc?

  2. Linux – Cara Portabel Untuk Mendapatkan Alamat Sumber Rute Default?

  3. Linux/bash:Bagaimana cara mendapatkan alamat IPv6 antarmuka?

  1. Bagaimana cara mendapatkan jumlah CPU di Linux menggunakan C?

  2. Cara mengatur alamat IP dari C di linux

  3. Linux mendapatkan semua nama antarmuka jaringan