![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пинг
DeeNamid © (2008-08-04 12:48:00)Вопрос такой, делаю пять потоков которые пингуют каждый свою машину и выводять результаты на пять окон, проблема с icmp-компонентом. Все пять потоков толкутся около icmp.ping() и результаты пинга искажаются.
Код примерно такой:
procedure Tping1.Execute;
begin
while not (terminated or application.Terminated) do begin
//EnterCriticalSection(CS);
res:=ping_func(ip_addres);
//LeaveCriticalSection(CS);
synchronize(print_res);
end;
end;
function Tping1.ping_func(host:string):integer;
var i,failed:integer;
begin
icmp.ReceiveTimeout:=3000;
icmp.Host:=host;
icmp.Ping();
if icmp.ReplyStatus.ReplyStatusType<>rsTimeOut then
ping_func:=icmp.ReplyStatus.MsRoundTripTime
else
ping_func:=0;
end;
Когда ставишь критическую секцию результаты отображаются адекватно, но пока один поток пингует все остальные его ждут. Как сделать так что бы все пинговалось независимо друг от друга?
DeeNamid (2008-08-05 13:45:00) [1]Спасибо всем. Начну разбираться с API и с ICS, потом отпишу что получилось.
Сергей М. (2008-08-05 13:43:00) [2]
> DeeNamid © (05.08.08 13:15) [89]
Взяв на вооружение ICS забудь про кросплатформенность своего приложения - оно не будет работать нигде кроме как под виндой
Anatoly Podgoretsky (2008-08-05 13:39:00) [3]> DeeNamid (05.08.2008 13:15:29) [89]
С хелпами для открытых, бесплатных программ всегда было плоховато. Но есть много примеров, wiki, FAQ и не полная справка. Ориентируйся в основном на примеры.
Сергей М. (2008-08-05 13:25:00) [4]
> Скачал Internet Component Suite
Мог бы и не качать)
Тоже самое, но с видом в анфас, тебе продемонстрировал Slym (C) - ICS.TPing использует именно API-вызов
DeeNamid (2008-08-05 13:15:00) [5]
> Anatoly Podgoretsky © (05.08.08 13:08) [85]
Скачал Internet Component Suite, там есть отдельный компонент пинг, для него есть какой-то хелп или описание?
Сергей М. (2008-08-05 13:11:00) [6]
> DeeNamid © (05.08.08 13:09) [87]
Да, в этом смысле, хотя и не обязательно (но очевидно. если такое событие фигурирует у компонента).
DeeNamid (2008-08-05 13:09:00) [7]
> И вообще - используй событие OnReply.
В смысле создать событие, которое будет отслеживать получение ответа, и в нем уже проверять ReplyStatus.SequenceId
Anatoly Podgoretsky (2008-08-05 13:08:00) [8]> Medbe}I{onok XML (05.08.2008 11:54:16) [76]
Этот Промпт Я
Anatoly Podgoretsky (2008-08-05 13:08:00) [9]> DeeNamid (05.08.2008 11:51:15) [75]
Странный вывод, что я не могу перевести и не использовать одновременно.
А переводил для вас и для себя, что бы понять, что зто за рыба.
Порекоменду
1. WinAPI, если это единственная задача;
2. Sinapse;
3. ICS;
4. поискать на Торри отдельный компонент, только для этой задачи.
Сергей М. (2008-08-05 12:24:00) [10]И вообще - используй событие OnReply.
Сергей М. (2008-08-05 12:23:00) [11]
> DeeNamid © (05.08.08 12:03) [78]
Первым делом при анализе результата запроса ты должен сравнить ReplyStatus.SequenceId c тем который ты передал параметром при вызове метода Ping.
Если они не совпадают, то ReplyStatus отражает контент ответа на совсем другой запрос)
DeeNamid (2008-08-05 12:22:00) [12]Я понял. То есть - я делаю генератор номера запроса, ставлю его в пинг. icmp сам по номеру запроса определяет номер ответа и пишет мне что он красавчег.
Хорошо сделаю реальные адреса, хотя я и использовал yandex.ru для пинга.
Сергей М. (2008-08-05 12:12:00) [13]
> DeeNamid © (05.08.08 12:03) [78]
Бросай тренироваться на своей vpn, используй для тестирования хосты реальных сетей, желательно с разными маршрутами)
Сергей М. (2008-08-05 12:07:00) [14]Секвенция - это дейтаграмма запроса и ответная дейтаграмма на этотзапрос.
Сергей М. (2008-08-05 12:06:00) [15]
> где i - номер потока
Да не номер потока, а уникальный номер запроса !
Вот для этого и нужен генератор)
DeeNamid (2008-08-05 12:03:00) [16]
> Сергей М. © (05.08.08 11:58) [77]
Что-то как-то сложновато ты высказался. уникальных идентификаторов секвенцийэто как сделать? я сейчас попробовал сделатьicmp.Ping('',i);, где i - номер потока. Получились немного другие результаты, но все равно чушь. Например он явно неработающий IP-шник пинговал как работающий.
Сергей М. (2008-08-05 11:58:00) [17]
> какой?
Генератор уникальных идентификаторов секвенций нужно реализовать.
Вот его-то в условиях много поточности как раз и следует защитить КС)
А защита метода Ping() как такового нафиг не нужна)
Medbe}I{onok XML (2008-08-05 11:54:00) [18]и это говорит человек который переводил "IndyInDepth". :D
Там по ходу промпт поработал.
DeeNamid (2008-08-05 11:51:00) [19]
> Anatoly Podgoretsky © (05.08.08 11:47) [73]
и это говорит человек который переводил "IndyInDepth". :D
Что советуешь, использовать WinAPI или что-то другое?
DeeNamid (2008-08-05 11:49:00) [20]
> Сергей М. © (05.08.08 11:40) [68]
> icmp-запросы требуют уникальной идентификации секвенций.
от есть я пишу так:icmp.Ping('',0);где вместо 0 я должен ставить уникальный идентификатор? какой?