Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пинг


Страницы:   1 2 3 4 5

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 я должен ставить уникальный идентификатор? какой?


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо