Как обнаружить изменение IP-адреса программно в Linux?

Если вы посмотрите на исходный код рамки здесь , вы увидите, что он не будет делать ежедневные журналы, а скорее записывается в один файл журнала lumen.log. Существует общедоступный метод, доступный configureMonologUsing в здесь и ссылка на здесь , которую вы можете использовать для переопределения поведения по умолчанию без расширения приложения.

Lumen просто устанавливает обработчик для монолога, так что еще одно хорошее решение: вы можете сделать это:

setFormatter(new LineFormatter(null, null, true, true));

        $this->app['log']->setHandlers($handlers);
    }

    /**
     * Register the log service.
     *
     * @return void
     */
    public function register()
    {
        // Log binding already registered in vendor/laravel/lumen-framework/src/Application.php.
    }
}

Затем не забудьте добавить поставщика услуг в ваш Lune bootstrap / app.php:

$app->register(\App\Providers\LogServiceProvider::class);

26
задан GEOCHET 23 February 2009 в 23:05
поделиться

8 ответов

В C для получения текущего IP я использую:

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

Замена "eth0" с интерфейсом Вы смотрите на. Все, что теперь необходимо сделать, опросить для разнообразия.

5
ответ дан ste 15 October 2019 в 07:32
поделиться

Это не легко всегда. Каждый дистрибутив Linux использует различные места для хранения IP-адресов, и т.д. (больше изменения, если Вы рассматриваете другие варианты UNIX). Вы можете использование, например, /sbin/ifconfig для получения IP-адресов интерфейсов, но Вы не можете даже быть уверены, найдете ли Вы, что оно в этом месте, или вообще, и т.д.

кроме того, учитывая Вас имеет тот исполняемый файл, необходимо настроить поток, назвав его для получения данных с установленным сроком (скажите 5 секунд), и интерпретируйте вывод. Это может варьироваться, например, если у Вас есть мосты, и т.д. и т.д. Таким образом, это не легко.

решение для А, которое прибывает по моему мнению, если у Вас есть возможность использования GNOME или некоторого другого широко распространенного распределения как KDE, можно полагаться на сообщения/информацию, которые они дают. Например, NetworkManager выводы сигнал к стандартная шина DBUS , когда устройство изменяется. Необходимо реализовать слушателя для тех, сигнализируют. Информация здесь (не работающий правильно теперь, таким образом, вот кэш ). Отметьте различные сообщения, когда новый интерфейс добавляется, или когда один из них изменяет IP-адрес. Это - лучший способ, которым я могу думать прямо сейчас.

4
ответ дан Diego Sevilla 15 October 2019 в 07:32
поделиться

Если Ваши пользователи используют NetworkManager, можно опросить NetworkManager. Соединение. Активный и NetworkManager. IP4Config через D-шину для получения более перекрестного распределения способ определить эту информацию.

2
ответ дан Sean 15 October 2019 в 07:32
поделиться

Если iproute2 будет установлен, и Вы находитесь на 2,6 ядрах, [то 111]

/sbin/ip monitor

произведет изменения в локальном интерфейсном состоянии и адресует к stdout. Ваша программа может считать это.

Вы могли также использовать тот же низкоуровневый механизм, как iproute2 инструмент делает (я думаю, что это - сокет netlink).

2
ответ дан MarkR 15 October 2019 в 07:32
поделиться

Один путь состоял бы в том, чтобы записать задание крона, которое содержит вызов к одному gethost семейство библиотечных функций. При использовании gethostbyname (), можно сравнить возвращаемые значения h_addr_list. Посмотрите человека gethostbyname.

, Если Вы, хотят сделать это из Вашей программы, породить pthread, который делает то же самое, затем спит в течение некоторого произвольного промежутка времени.

1
ответ дан Dana the Sane 15 October 2019 в 07:32
поделиться

Предложение ste использовать ioctl SIOCGIFADDR раньше было технически правильным, к сожалению, оно ненадежно для современных систем Linux, где один интерфейс может иметь несколько адресов без использования суб-интерфейсов (например, eth0 : 1), как это было сделано с уже устаревшим ifconfig.

2
ответ дан 28 November 2019 в 06:35
поделиться

Из справочной страницы rtnetlink:

ОПИСАНИЕ

Rtnetlink позволяет читать и изменять таблицы маршрутизации ядра. Он используется внутри ядра для связи между различными подсистемами, хотя это использование здесь не описано, а также для связи с программами пользовательского пространства. Сетевые маршруты, IP-адреса, параметры канала, настройки соседей, дисциплины очередей, классы трафика и классификаторы пакетов могут управляться через сокеты NETLINK_ROUTE. Он основан на сообщениях netlink, дополнительную информацию см. В netlink (7).

0
ответ дан 28 November 2019 в 06:35
поделиться

вот так .. это делает это без опроса.

он прослушивает только RTM_NEWADDR, но его должно быть легко изменить для поддержки RTM_DELADDR, если вам нужно

#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;
}
48
ответ дан 28 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: