LINUX.ORG.RU

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

 ,


1

1

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

★★★★★

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

Вот завтра и приходите. Вас много а я одна

anonymous
()

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

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

hateyoufeel ★★★★★
()

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

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

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

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

чтение из сокета
каждому хосту свой сокет

x905 ★★★★★
() автор топика

Добавлю проверку источника

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

да, начинаю понимать, ранее нужды не было

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

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

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

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

да, я начал понимать
уже переписал, пока без проверок кроме хоста, но добавлю возможно
обошелся одним сокетом + QSocketNotifier

x905 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.