
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, atauwlan0
,wlan1
untuk wireless lan. Pada konfigurasi linux yang menggunakan normalisasi penamaan interface, bisa saja nama ethernet beruban menjadi sepertiens33
. - 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