Поймай момент, когда у нас есть Wi-Fi соединение - PullRequest
3 голосов
/ 15 февраля 2011

Мне нужно написать программу, которая выполняет следующие шаги:

  1. Запустить программу (демон)
  2. Подождите (сон, блокировка), пока у меня не будет Wi-Fi соединение
  3. Отправить / получить некоторые данные с сервера
  4. Дождаться, пока соединение Wi-Fi не оборвется
  5. Перейти к 2

Проблема с шагом 2. Я не знаю, как ловить момент, когдаустановлено сетевое соединение.Существует /proc/net/wireless entry, где появляется информация о доступных беспроводных соединениях, но попытка отслеживать ее с помощью inotify не удалась.Сетевое соединение устанавливается асинхронно.

Вот мой тестовый код с inotify (скопированный в основном из книги R.Loves):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <sys/select.h>

#define BUF_LEN 1024

int
main() {

    int fd, wd, rc;
    char buf[BUF_LEN];
    ssize_t len, i = 0;
    static fd_set read_fds;

    fd = inotify_init();
    if (fd == -1) {
        perror("inotify_init");
        exit(EXIT_FAILURE);
    }

    wd = inotify_add_watch(fd, "/proc/net/wireless", IN_ALL_EVENTS);
    if (wd == -1) {
        perror("inotify_add_watch");
        exit(EXIT_FAILURE);
    }

    for (;;) {

        FD_ZERO(&read_fds);
        FD_SET(wd, &read_fds);
        rc = select(wd + 1, &read_fds, NULL, NULL, NULL);
        if (rc == -1)
            perror("select");

        len = read(fd, buf, BUF_LEN);
        while (i < len) {
            struct inotify_event *event = (struct inotify_event *) &buf[i];
            printf("wd=%d mask=%d cookie=%d len=%d dir=%s\n",
                event->wd, event->mask, event->cookie, event->len, 
                (event-> mask & IN_ISDIR) ? "yes" : "no");
            if (event->len)
                printf("name=%s\n", event->name);

            i += sizeof(struct inotify_event) + event->len;
        }

        sleep(1);
    }

    return 0;
}

Он срабатывает только когда я делаю cat /proc/net/wireless

Вопрос:Как уловить момент, когда у меня запущено сетевое соединение (wifi), использующее только функции Linux?

PS Это мой первый пост, надеюсь, все в порядке.

1 Ответ

1 голос
/ 15 февраля 2011

Вы можете определить, когда сетевое соединение (не только Wi-Fi) становится готовым к соединению через интерфейс netlink, rtnetlink.

Это не простой интерфейс для программирования, поэтому вы можете вместо этого вызвать процесс "ip monitor link". Если вы видите, что интерфейс имеет флаг LOWER_UP, это означает, что он готов к отправке / получению (РЕДАКТИРОВАТЬ: Вы также можете проверить, отсутствует ли флаг NO_CARRIER; см. Комментарий Саймона).

Однако существует также проблема, заключающаяся в том, что у вас может быть состояние гонки с таким демоном, как NetworkManager, который попытается (если он настроен) получить IP-адрес после того, как ссылка станет доступной.

...