3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
|
|||||||||||
1 | |||||||||||
Сканирование компьютеров на присутствие в сети онлайн. #threads #c++11 #ping #icmp30.01.2015, 17:32. Показов 2818. Ответов 5
Метки нет (Все метки)
Пишу программу, которая будет проверять наличие компьютеров в сети. Нашел на msdn код для отправки ICMP запроса. Пытаюсь использовать этот метод для определения компьютера в сети. При последовательном выполнении вроде работает правильно. Если icmp_echo вернула 0, я считаю, что компьютер в сети. Вот код:
Кликните здесь для просмотра всего текста
Разумеется если в сети несколько устройств(компьютеров и т.д.). То ждать долго не хочется. Я добавил потоки c++11. И результаты стали другими. Теперь функция icmp_echo начинает возвращать рандомные значения то 0, то 4. Вот код: Кликните здесь для просмотра всего текста
Помогите разобраться или предложите свой вариант как можно реализовать многопоточную проверку компьютеров на наличие в сети онлайн более точным способом. P.S. еще хотелось бы сделать проверку не просто по IP, а по хосту например home-pc, notebook и т.д. P.S.2. Аналогично я делал потоки CLI, потоки на библиотеках QT и на разных языках программирования. Пробовал также пинговать через стандартную утилиту ping. Проблема всегда одна и та же. При последовательном выполнении - верно, в потоках - рандомные значения.
0
|
30.01.2015, 17:32 | |
Ответы с готовыми решениями:
5
Отображение компьютеров в сети, ее сканирование Сканирование компьютеров в сети в отдельном потоке Сканирование компьютеров в одной сети на запущеный процесс Утилита ping (icmp) |
30.01.2015, 18:20 | 2 |
Зачем нужен бесконечный цикл в 58-й строке? Это как минимум одна из проблем.
Добавлено через 7 минут Тут detach() не нужен. Нужен join(). Добавлено через 1 минуту Да и смысл цикла в 44-й строке мне не понятен..
1
|
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
|
|||||||||||
30.01.2015, 19:07 [ТС] | 3 | ||||||||||
Изучил функцию IcmpSendEcho и структуру ICMP_ECHO_REPLY более подробно. Оказалось, что статус возвращается в элемент Status структуры ICMP_ECHO_REPLY и принимает значение 0, в случае удачи (#define IP_SUCCESS 0 // The status was success.), иное в противном случае и делать выводы лучше не по этому. В моем случае в начальной реализации я делал выводы по тому, что возвращает IcmpSendEcho ( (dwRetVal != 0) ) и она периодически возвращает 0, что значит ошибка. При помощи GetLastError() я обнаружил, что она возвращает ошибку 11010 (#define WSA_QOS_ADMISSION_FAILURE 11010 // Error due to lack of resources.). То есть в случае ошибки нельзя однозначно сказать в сети адрес или нет. Зато, если вернулся IP_SUCCESS в Status, то адрес в сети. Переписал в соответствии с новой информацией, получилось так. Теперь работает более правильно(нету никаких рандомных значений в выводе), и код функции получился короче:
Кликните здесь для просмотра всего текста
Теперь функция возвращает 1 только в случае успеха, и 0 во всех остальных случаях(недоступен хост, ошибка в выполнении самой функции и прочие ситуации). Жду мнения и критики насчет такого подхода. Добавлено через 57 секунд Мне нужно, чтобы бесконечно выводились статусы(мониторинг), а метод join() блокирует основной поток. Меня больше интересует нужна ли динамически выделенная переменная в векторе, или её можно уничтожить хоть сразу после созданная потока?.
0
|
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
|
|
30.01.2015, 23:09 [ТС] | 5 |
0
|
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
30.01.2015, 23:25 | 6 |
Сообщение было отмечено BlackUser как решение
Решение
Тем не менее, detach тут не нужен. Потому что поток не имеет корректного способа завершения. Не нужно приучать себя к плохому.
join нужно делать после цикла в main. Тогда работа блокироваться не будет. Но, нужно обеспечить, также, корректное завершение потока и цикла в main (например по Ctrl-C). Цикл в main завершился, далее посылаем завершение потоку, вызываем join. Основной поток блокируется на время, которое требуется для завершения второго, потом выходим из программы. Итого все ресурсы корректно освобождены.
1
|
30.01.2015, 23:25 | |
30.01.2015, 23:25 | |
Помогаю со студенческими работами здесь
6
Ping с использованием ICMP Образец ICMP-ping Блокировать запросы ICMP ping С++. Ping с использованием библиотеки icmp.dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |