Poco ping безопасен - PullRequest
       14

Poco ping безопасен

0 голосов
/ 18 марта 2019

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

Проблема, которую я получаю, заключается в следующем:

Я пингую 2 IP адреса,

  1. Поток 1 - пинг IP-адреса 1 - ПК с действующим и существующим IP-адресом
  2. Поток 2 - ping IP Address 2 - IP, который не существует в частной сети

Сначала я запускаю тему 2. Ping-запросы из этого потока (или хост недоступен), как и ожидалось. Во время работы потока 2 я запускаю поток 1 после небольшой задержки.

В потоке 1 я получаю ответ от IP-адреса 1 (как я должен), но я также получаю ответ от IP-адреса 2 в потоке 2, даже если на этом IP-адресе нет устройства! Ответ от IP-адреса 2 принимается всякий раз, когда получен ответ от IP-адреса. Когда поток 1 спит без проверки связи с IP-адресом 1, поток 2 выдает результаты тайм-аута, как и ожидалось. Ресурс 1 и 2 не используется совместно, и каждый пинг выполняется через отдельный выделенный объект клиента ICMP.

Я считаю, что второй поток видит ответ от IP-адреса 1 и не выясняет, что это не ответ от его собственного запроса проверки связи, но я не могу понять, почему это происходит.

Код ping совпадает с примером ping.cpp, предоставленным в poco-1.9.0 / Net / samples / Ping / src / Ping.cpp.

У кого-нибудь есть идеи или предложения?

Спасибо

1 Ответ

1 голос
/ 18 марта 2019

В протоколе ICMP нет ничего, что позволяло бы сетевому стеку определять, какой пакет ICMP направить в какой приемный сокет.Вам нужно добавить идентификатор к каждому отправляемому вами пакету и вести некоторую бухгалтерию, чтобы убедиться, что ваш код направляет его в нужный поток.

У вас есть несколько потоков, которые могут отправлять пакеты, но вы, вероятно, хотите иметь только один потокполучение пакетов и отправка в правильный поток или отправка всем потокам, и пусть каждый поток решает, является ли он релевантным, на основе идентификатора, который он добавил при отправке пакета.

...