LINUX.ORG.RU

Звуковое уведомление о сети. C.

 , ,


2

5

По следам своей старой темы (Голосовое оповещение о поче (скрипт)) решил доработать скрипт. Суть все та же: Если теряем связь с ресурсом, то запускаем программу, которая:

  1. Единожды звуком (через beep) уведомляет о том, что сети нет.
  2. Продолжает работать в фоне, с интервалом (однократно) отправляя ping на ресурс.
  3. Если ресурс доступен, уведомляет звуком и завершает работу. Параметр 1 в аргументы задает бесконечный мониторинг ресурса. Уведомлять будет только при изменении состояния.

Видео для улучшения понимания того, как работает скрипт: https://youtu.be/jVtt_ol9S4g?si=Ztz2ki6YpBl2sR-M

Удобно поставить на cron при старте. Компилируется так:

gcc test_ip.c -o  test_ip.o

Первая версия (удалена).

Отредактированный вариант (перемещён на git): https://gitflic.ru/project/dcc0/test_ip_finite_machine/blob/?file=test_ip_Christmas.c&branch=test_ip.c

https://github.com/dcc0/finite_machine_test_ip/blob/main/test_ip_Christmas.c

Вариант bash с Curl для тестирования сайта: https://github.com/dcc0/finite_machine_test_ip/blob/main/test_web_new.sh



Последнее исправление: AnonymUser (всего исправлений: 35)
Ответ на: комментарий от AnonymUser

Конечно так лучше. Вопрос в том, что иногда i нужен тебе и после цикла, чтобы знать сколько итераций были успешными. Все это вкусовщина, не слушай странных людей, которые будут орать ДЕЛАЙ ТАК ИНАЧЕ ПОМОЙКА АД СОТОНА МЫ СЪЕДИМ ТВОИХ ДЕТЕЙ.

gaylord
()
Ответ на: комментарий от gaylord

иногда i нужен тебе и после цикла, чтобы знать сколько итераций были успешными

В лямбду его завернуть, всего и делов. Или выбрать язык, в котором цикл возвращает значение.

А, Си. Тогда страдать.

anonymous
()
Ответ на: комментарий от MKuznetsov

в этом виде читаемость никакая и сообщения про ошибки ни о чём. И ещё память утекает.

Про память это не ко мне, я только переформатировал код который мне дали. А насчёт читаемости не согласен.

вы возможно тайно завидуете лисперам, что любите вложенность скобок и не контролируете память

Нет. Вложенность скобок мне не нравится, но это лучше чем спам лишними строками. Про память см. выше. Ну и вне контекста судить невозможно течёт она или нет.

о том что foobar_new() не вышел, надо было верещать в самом foobar_new - там и причину можно назвать.

Вобщем ты походу не понял о чём спор. А претензии по поводу неправильной логики адресуй gaylord-у который этот код придумал.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я немного страдаю когда читаю свой старый код (из годов 2005-2009 - я тогда только начал Си внедрять в свою жизнь, до этого Паскаль в основном был) - вот там как раз в лучших традициях непонимание разницы Си и С++, объявления переменных где попало, вызов функций в качестве инициализаторов в объявлении итд. Но то длилось недолго, я довольно быстро, всего за несколько лет, научился форматировать код нормально, но написанное с тех времён всё ещё не переписано и немного используется в проде, так что приходится лазить.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если код языка программирования невозможно прочитать без IDE то это плохой код и плохой язык.

Любой современный код невозможно прочитать без IDE, просто потому, что через 10 минут ты устанешь грепать декларации классов и таки откроешь IDE. Ну и все современные языки (Rust, Go, Haskell) опускают указание типа и выводят значения сами.

let f = File::new(); 

Кажется очевидным, что f – структура типа File.

gaylord
()
Последнее исправление: gaylord (всего исправлений: 3)
Ответ на: комментарий от iron

Предлагаете усложнить программу?! А цель?! Увеличить знания?! Или улучшить программу?!

Избыточный код не нужен! Даже в угоду ускорению. В данном случае. Знания тоже могут быть избыточными!

P.S. Все-таки в связке с Bash ANSI C бодрствует.

https://youtu.be/vZ-rdnBTPHM

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 4)
Ответ на: комментарий от AnonymUser

Увеличить знания?! Или улучшить программу?!

И то, и другое.

Знания тоже могут быть избыточными!

Не соглашусь. Один раз напишешь, забудешь. Но все равно, отложится на подкорке «указатель» на эти знания. Потом если понадобится – сможешь очень быстро разобраться.

iron ★★★★★
()
Ответ на: комментарий от iron

С последним утверждением трудно спорить. Но вопрос: нужны ли эти знания?! Я пока не уверен.

P.S. Глянул про epoll.

С моей колокольни - довольно глубокая инженерия. Надо хорошо внутрях ядра разбираться. Не для рядовых пользователей, так сказать.

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 4)
Ответ на: комментарий от iron

Отличный код, наверное. Я не могу оценить. Отформатирован прекрасно. Надо будет на этот вариант ориентироваться.

Минус для меня: два комментария на 100 строк.

epoll с мультиплексированием не свзяан?

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Минус для меня: два комментария на 100 строк.

Читаешь ман по каждой функции. Там особо нечего комментировать.

epoll с мультиплексированием не свзяан?

Связан. Спроси у чата гопоты, он тебе подробно про него начирикает. Еще и примеры использования накидает, с подробным объяснением.

iron ★★★★★
()
Ответ на: комментарий от IIIypuk

Какая связь? Или только отрывок пояснения прочитали?!

P.S.

Я на примере данной задачи (которую очень давно нашёл где-то в группе в ВК) по комментариям однажды уже убедился, что люди не вникают в условия, даже не спрашивают, для чего это нужно, но сразу начинают писать комментарии. Я не ставлю в вину и не осуждаю, только констатирую факт. Хотя, конечно, на форум многие заходят именно пообщаться (что-то написать… вникают не сильно в чужие топики). Но отвечать на вопрос нет смысла.

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от AnonymUser

Потому что когда ты отправляешь например команду POP3 для подключения к серверу ты и так получаешь ошибку подключения. Почему не использовать этот метод проверки соединения, а городить вызовы ping?

А рассмотреть факт, что на ресурсе может уже не быть нужного сервиса нет необходимости?

IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

В общем нет. Я такой задачи не ставил. Ping (если следовать справке) отправляет ICMP.

Тут задача простая: проверить, есть ли сеть вообще и уведомить звуком через определённое время, чтобы пользователь на время ожидания мог отойти от компьютера.

Пинговать можно и шлюз, даже какой-нибудь локальный роутер. Или сайт, который пропадает. Особенной роли не играет. Пинговать все время плохо, наверное. Но есть интервал третьим параметром. Без него после обнаружения программа завершится.

Какая связь, с POP3 я не понял.

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Тут задача простая: проверить, есть ли сеть вообще

задача пипз как непростая..в общем случае вообще не решаемая. В общем случае:даже с неработающим DNS и единственным интерфейсом 127.0.0.1, на нём может висеть http-proxy и весь интернет доступен.

и пингом не проверить. Его могут резать на любом плече. Связь есть, пингов нет :-) бывает и наоборот что пинги ходят, никакой tcp не пашет.

по хорошему, ping это средство диагностики. Его запускают если что-то уже не сработало, для уточнения причин. То есть на примере того-же pop3 - если tcp там вообще не встало, то тогда имеет смысл думать про ping.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ну. Все верно. Работал-работал с сайтом, связь прервалась. Запустил скрипт и ушел от компа до оповещения.

Если верить справочнику ping работает с другим уровнем, чем tcp. Пинги могут не ходить, а сайт работать, если браузер его забирает из какого-нибудь кеша к примеру или прокси и т.д.

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

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)

C beepом возни много, в плане установке пакетов, прав юзеру. Да и «достает» системный динамик, а тональность под линуксом в бипе как то не выставляется, вроде бы..

Раз уж такой балбес - может через sdl2 какой нибудь реализуешь.

+ Хочешь на динамики, хочешь на наушники слушаешь
- Да практически нету
anonymous
()
Ответ на: комментарий от MKuznetsov

Можно вторую проверку запустить через curl

TEST_WEB=`curl -o /dev/null -s -w "%{http_code}\n" $1`
case $TEST_WEB in
        "200")
beep -f 600 -l 500; 
beep -f 500 -l 500; 
beep -f 600 -l 500; 
;;

        "000")
beep -f 200 -l 500; 
;;
esac
AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

У меня нет такого.

В изначальной задаче было сделать проверку с пингом. Задача звучала так (сформулирована не мной)

  1. Использовать ping
  2. Скрипт должен работать непрерывно
  3. Уведомлять только при изменении состояния.
AnonymUser
() автор топика