GNU/Linux >> Tutoriels Linux >  >> Linux

Comment détecter le changement d'adresse IP par programmation sous Linux ?

voilà.. ça le fait sans interrogation.

il n'écoute que RTM_NEWADDR mais il devrait être facile de le modifier pour prendre en charge RTM_DELADDR si vous en avez besoin

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

En C, pour obtenir l'IP actuelle j'utilise :

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

Remplacez "eth0" par l'interface que vous regardez. Il ne vous reste plus qu'à interroger pour changer.


Linux
  1. Comment changer un nom d'hôte sous Linux

  2. Comment changer l'adresse MAC en utilisant macchanger sur Kali Linux

  3. Comment changer un nom d'utilisateur sous Linux

  4. Comment changer le nom d'hôte sous Linux

  5. Comment changer le port SSH sous Linux

Comment changer l'adresse MAC du réseau sous Linux

Comment changer l'adresse MAC sous Linux

Comment changer un shell d'utilisateurs sous Linux

Comment changer d'utilisateur sous Linux

Comment changer l'adresse IP sous Linux

Comment obtenir votre adresse IP sous Linux