Untuk mengetahui ip address peralatan jaringan di linux bisa dengan menggunakan command ifconfig, atau bisa juga digunakan dengan cara ifconfig namainterface. Misalnya:

ifconfig eth0

Maka informasi untuk interface dengan nama eth0 (Biasanya untuk perangkat ethernet) akan ditampilkan seperti berikut:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.99.32  netmask 255.255.254.0  broadcast 192.168.99.255
        inet6 fe80::bc5:713e:d2f0:4da  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:c7:8c:d5  txqueuelen 1000  (Ethernet)
        RX packets 54494  bytes 8566931 (8.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29  bytes 4084 (3.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Dari command tersebut, Kita juga dapat melakukan filter dengan command grep agar yang tampil hanya pada baris ipv4, yaitu yang memiliki awalan “inet ” (tanpa 6) seperti berikut:

ifconfig eth0 | grep 'inet '

Command di atas akan menghasilkan informasi seperti berikut:

        inet 192.168.99.32  netmask 255.255.254.0  broadcast 192.168.99.255

Dan dari hasil ifconfig yang sudah di grep ini, Kita masih bisa mendapatkan informasi yang hanya berupa IP Address nya dengan menggunakan command awk untuk mengambil kolom kedua seperti berikut:

ifconfig eth0 | grep 'inet ' | awk '{print $2}'

Command di atas akan menghasilkan ip address seperti berikut:

192.168.99.32

Dalam Bahasa C

Tapi yang akan dibahas sebenarnya disini adalah cara mendapatkan IP Address dengan menggunakan fungsi yang ada dalam bahasa C pada Linux.

Dengan command di atas sebenarnya Kita bisa juga mengimplementasikan ambil IP Address dengan bantuan system atau exec family, tapi menggunakan fungsi library network di C mungkin lebih ramah format dan efisien dibandingkan dengan menjalankan proses baru.

Pada fungsi berikut, Saya akan menggunakan getifaddrs untuk mendapatkan alamat-alamat dari interface jaringan. Tapi dikarenakan hasil dari getifaddrs merupakan linked-list, maka Kita harus melakukan looping untuk mencari nama interface yang dicari.

Bila interface yang dicari ditemukan, maka dapatkan alamat numerik ip-address dari interface tersebut dengan menggunakan getnameinfo.

Berikut source code lengkapnya untuk fungsi mengetahui ip-address:

/*
 * Copyright 2022 Ahmad Amarullah (https://amarullz.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

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

/**
 * Dapatkan ip address untuk interface tertentu
 *
 * @param const char * nama interface (eth0, wlan0, lo)
 * @param char * output buffer untuk menampung ip address
 * @param int ukuran buffer
 * @return int Bila berhasil berisi panjang output. 0 bila gagal
 */
int get_ipv4address(const char* iface, char* out, int sz) {
  // Pastikan output buffer tidak null
  if (!out) return 0;

  struct ifaddrs *ifaddr, *ifa;
  char host[NI_MAXHOST];
  int len = 0;

  // Ambil semua alamat interface
  if (getifaddrs(&ifaddr) == -1) return 0;

  // Loop untuk mencari interface yang dicari
  for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL) continue;

    // Cek kecocokan string
    if ((strcmp(ifa->ifa_name, iface) == 0) &&
        (ifa->ifa_addr->sa_family == AF_INET)) {
      // Copy ip address kedalam variabel
      if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host,
                      NI_MAXHOST, NULL, 0, NI_NUMERICHOST) != 0)
        return 0;

      // Simpan ip address pada output buffer
      len = snprintf(out, sz, "%s", host);
      // Break agar tidak perlu mencari yang lain
      break;
    }
  }

  // Free linked list interface
  freeifaddrs(ifaddr);
  return len;
}

Fungsi tersebut dapat dipanggil seperti contoh di bawah ini:

int main(int argc, char *argv[]){
  char ip[16];
  if (get_ipv4address("eth0", ip, 16)>0)
    printf("IP Address untuk eth0 adalah: %s\n",ip);
  else
    printf("IP Address tidak ditemukan\n");
  return 0;
}

Dengan mengirimkan tiga argumen, yaitu:

  • const char * iface – Nama interface yang akan dicari, misalnya eth0, eth1 untuk ethernet, atau wlan0, wlan1 untuk wireless lan. Pada konfigurasi linux yang menggunakan normalisasi penamaan interface, bisa saja nama ethernet beruban menjadi seperti ens33.
  • char * out – Output buffer untuk menampung ip address yang didapatkan. Rekomendasi panjangnya 16 karakter (Panjang maksimal IPv4 address=15 karakter ditambah 1 karakter end of string).
  • int sz – Untuk memastikan saja kapasitas ukuran buffernya.

Fungsi akan memberikan return 0 bila gagal, atau bukan 0 bila berhasil. Bila berhasil return value ini dapat juga digunakan untuk mengetahui panjang string dari output buffer tanpa harus menjalankan fungsi strlen.

Source code lengkap dapat juga di download di gist:

https://gist.github.com/amarullz/144d19925df827b6ce43f0194177652b