Мне нужно написать программу, которая выполняет следующие шаги:
- Запустить программу (демон)
- Подождите (сон, блокировка), пока у меня не будет Wi-Fi соединение
- Отправить / получить некоторые данные с сервера
- Дождаться, пока соединение Wi-Fi не оборвется
- Перейти к 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 Это мой первый пост, надеюсь, все в порядке.