LINUX.ORG.RU

Закат пинга вручную

 ,


1

1

Задумал написать небольшую функцию пинга т.к. вызывать внешний ping несколько «надоело»
Взял для примера https://www.geeksforgeeks.org/ping-in-c/, выкинул лишнее (мне один пакет достаточно), запихал в поток (qtconcurrent qfuturewatcher) и вроде оно работает
Но стали ползти странные баги если пинговать сразу две цели (живую и заведомо дохлую) - «дохлая» цель становится «живой» и для неё recvfrom возвращает данные от «живой»
Минимальный пример смогу завтра, но может быть есть какие мысли - почему оно так себя ведёт ?

★★★★★

но может быть есть какие мысли - почему оно так себя ведёт ?

Смешались в кучу кони, люди. Как ты опознаёшь, что понг от нужного тебе хоста пришёл?

hateyoufeel ★★★★★ ()

Но стали ползти странные баги если пинговать сразу две цели (живую и заведомо дохлую) - «дохлая» цель становится «живой» и для неё recvfrom возвращает данные от «живой»

Где-то у тебя потоки в глобальную переменную пишут походу. Смотри что у тебя с сокетами...

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

Нет. man 7 raw. Слушающих raw-сокет получает все пакеты заданного ip-протокола (icmp) в вашем случае. Гикнутый код по вашей ссылке полный треш. Он не смотрит откуда пришёл пакет и выводит на экран для любого icmp-ответа информацию, что он пришёл с нужного ip-адреса. Достаточно запустить в одном терминале этот ping на недоступный хост, а в другом — на доступный...

В правильном пинге необходимо после отправки пакета в цикле делать recvfrom(), пока не будет получен нужный icmp-echo-ответ или не выйдет таймаут. Ну можно ещё icmp_id проверять, хотя, ИМХО, в вашем случае не важно, пришёл ли ping-ответ на пакет от вашей программы или от запущенного в соседнем терминале ping'а.

mky ★★★★★ ()