GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendeteksi perubahan alamat IP secara terprogram di Linux?

ini dia.. ini melakukannya tanpa polling.

itu hanya mendengarkan RTM_NEWADDR tetapi seharusnya mudah diubah untuk mendukung RTM_DELADDR jika Anda membutuhkannya

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <net/if.h>

int
main()
{
    struct sockaddr_nl addr;
    int sock, len;
    char buffer[4096];
    struct nlmsghdr *nlh;

    if ((sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) {
        perror("couldn't open NETLINK_ROUTE socket");
        return 1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.nl_family = AF_NETLINK;
    addr.nl_groups = RTMGRP_IPV4_IFADDR;

    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        perror("couldn't bind");
        return 1;
    }

    nlh = (struct nlmsghdr *)buffer;
    while ((len = recv(sock, nlh, 4096, 0)) > 0) {
        while ((NLMSG_OK(nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE)) {
            if (nlh->nlmsg_type == RTM_NEWADDR) {
                struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(nlh);
                struct rtattr *rth = IFA_RTA(ifa);
                int rtl = IFA_PAYLOAD(nlh);

                while (rtl && RTA_OK(rth, rtl)) {
                    if (rth->rta_type == IFA_LOCAL) {
                        char name[IFNAMSIZ];
                        if_indextoname(ifa->ifa_index, name);
                        char ip[INET_ADDRSTRLEN];
                        inet_ntop(AF_INET, RTA_DATA(rth), ip, sizeof(ip));
                        printf("interface %s ip: %s\n", name, ip);
                    }
                    rth = RTA_NEXT(rth, rtl);
                }
            }
            nlh = NLMSG_NEXT(nlh, len);
        }
    }
    return 0;
}

Di C, untuk mendapatkan IP saat ini saya menggunakan:

    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));

Ganti "eth0" dengan antarmuka yang Anda lihat. Yang perlu Anda lakukan sekarang hanyalah polling untuk perubahan.


Linux
  1. Cara mengubah nama host di Linux

  2. Cara Mengubah Nama Pengguna di Linux

  3. Cara Mengubah Nama Host di Linux

  1. Cara mengubah alamat MAC menggunakan macchanger di Kali Linux

  2. Cara Mengubah Port SSH Di Linux

  3. Cara Mengganti Shell di Linux

  1. Bagaimana cara mengubah alamat IP di RHEL 8 / CentOS 8 Linux

  2. Cara mengubah nama host di Redhat 7 Linux

  3. Bagaimana menemukan alamat IP di Kali Linux