Здравствуйте!
Я вот хочу пропингать все компьютеры в заданном диапазоне адресов.
Для этого я использую функции из ICMP.DLL:
IcmpCreateFile()
IcmpSendEcho()
IcmpCloseHandle()
Но дело в том, что если комп какой-то выключен, то IcmpSendEcho() долго молчит (несколько секунд), и есстественно если у меня больой диапазон адресов, то многие компы выключены и в итоге пинг всех компов занимает долгое время.
Вопрос такой: как можно уменьшить это время (какие может быть есть идеи) ?
или может быть подскажите другой способ пингования компа.
Заранее спасибо БОЛЬШОЕ!
С уважением, Ольга.
Может быть подскажите какие функции мне смотреть?
Отправлен: 03.02.2005, 04:12
Вопрос задала: rolechka (статус: Читатель)
Всего ответов отправлено: 5
Отвечает: DiGiT
Здравствуйте, rolechka!
Попробуйте использовать потоки. Не обязательно для каждого хоста создавать поток, можно например создать их 20 штук, и за каждым закрепить свой диапазон.
Ответ отправил: DiGiT (статус: 6-ой класс)
Отправлен: 03.02.2005, 09:51
Отвечает: Gibbel
Здравствуйте, rolechka! Последний параметр функции IcmpSendEcho() определяет максимальное время, в течение которого будет ожидаться ответ. Посмотрите, сколько времени у вас занимает ping включенных машин, и установите соответствущее значение этого параметра. Или используйте функцию IcmpSendEcho2().
Ответ отправил: Gibbel (статус: *Админ)
Отправлен: 03.02.2005, 11:27
Отвечает: vitya
Здравствуйте, rolechka!
1. делайте запросы в нескольких потоках
2. последний параметер SendEcho является задержкой - сколько ждать - задавайте ваше время.
Ответ отправил: vitya (статус: Профессор)
Отправлен: 03.02.2005, 11:28
Отвечает: Bob Johnson
Здравствуйте, rolechka!
Для этого следует создать несколько потоков (например, 100) и каждому из них задать пинговать определенный адрес. тогда если пинг не отвечает неск. секунд (например 5), то ты получишь в среднем 100/5 = 20 адресов в секунду.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 03.02.2005, 15:41
Отвечает: John Freeman
Здравствуйте, rolechka!
Если в локалке - проще пытаться соединиться с 135,139,445 портами - быстрее будет+можно имя компа сразу получить+таймаут сама устанавливать сможешь.
Ответ отправил: John Freeman (статус: Практикант)
Отправлен: 04.02.2005, 00:10
Вопрос № 16580
Здравствуйте, ув. тов. эксперты.
Такая проблема: в обработку сообщения WM_DESTROY, как и положено,
пихаю PostQuitMessage(0). После того, как кликаю на крестик
закрытия окна, окно закрывается, но программа остается в памяти. Что
не так?
Приложение:
Отправлен: 03.02.2005, 11:39
Вопрос задал: Игорь-83 (статус: Читатель)
Всего ответов отправлено: 2
Отвечает: CrackLab
Здравствуйте, Игорь-83!
Дело в том, что когда вы кликаете на крестик, отсылается сообщение WM_CLOSE.
Но у вас нет обработчика этого сообщения. Поэтому допишите обработчик WM_CLOSE (в котором вызывайте PostQuitMessage(0) или ExitProcess(0))
или просто замените строчку
while(GetMessage(&msg,hWnd,0,0))
на
while(GetMessage(&msg,NULL,0,0))
Ответ отправил: CrackLab (статус: Студент)
Отправлен: 03.02.2005, 12:10
Отвечает: Bob Johnson
Здравствуйте, Игорь-83! В строке while(GetMessage(&msg,hWnd,0,0)) надо поставить 0 вместо hWnd, т.к. PostQuitMessage посылает сообщение WM_QUIT потоку, а не конкретному окну.
* EMan2.0: ---===*** Debug mode ***===---
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 04.02.2005, 00:53