Пинг компьютера подключенного через маршрутизатор

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

[syntax=delphi]IdIcmpClient1.Host := '192.168.0.1'; // Без порта и с портом не определяет
IdIcmpClient1.Ping;
Memo1.Lines.Add('Время до хоста: ' + IntToStr(IdIcmpClient1.ReplyStatus.MsRoundTripTime) + ' ms ' + ComboBox1.Text);[/syntax]
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

а в чем собственно вопрос?
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

BulldozerBSG писал(а):а в чем собственно вопрос?

Вы меня просто убили своим вопросом :) . Почему данный мпособ не работает, ведь должна быть причина так как наблюдается следствие.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Shouldercannon писал(а):[syntax=delphi]IdIcmpClient1.Host := '192.168.0.1'; // Без порта и с портом не определяет
IdIcmpClient1.Ping;
Memo1.Lines.Add('Время до хоста: ' + IntToStr(IdIcmpClient1.ReplyStatus.MsRoundTripTime) + ' ms ' + ComboBox1.Text);[/syntax]
Честно говоря напомноло диалог:
- Сколько?
- 5
- Что 5?
- Что "сколько"?

Ну а теперь попарядку касательно вопроса:
Незнаю что это за компорнент но из названия могу предположить что он работает через протокол ICMP. В нем такого понятия как порт вобще не существует.
Для пинга необходимо время, поетому в коде врядли получится сразу получить результат. Скорее всего компонент сам уведомляет о результате, по истечению определенного времени.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

А вот собственно кусочек статьи (http://citforum.ru/nets/articles/ping/) как раз все объясняет как пользоватся

Использование Indy

Те, кто не знакомы с практикой программирования с использованием Windows API, могут воспользоваться встроенными в Delphi компонентами для работы с сетью. В частности, для реализации пинга на уровне объектно-ориентированного программирования воспользуемся компонентом IdICMPClient из состава Indy.

Для этого создадим сначала на пустой форме экземпляр класса TIdICMPClient, перетащив его с палитры компонентов Indy Clients. Затем поместим на форму стандартную кнопку (TButton) и в ее реакции на нажатие мышкой запишем код:

Код: Выделить всё

Self.IdIcmpClient1.Host:='localhost';//вместо 127.0.0.1 здесь можно использовать имя "localhost"
Self.IdIcmpClient1.Ping;
И не забудем выставить соответствующий интервал ожидания ответа, по завершении которого (или при получении данных от пингуемого) вызывается обработчик:

Код: Выделить всё

TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:TReplyStatus);
- в котором мы реализуем вывод данных пинга на экран:

Код: Выделить всё

procedure TForm1.IdIcmpClient1Reply (ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
ListBox1.Items.Add ('Reply:'+IntToStr (AReplyStatus.MsRoundTripTime));
end;
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

BulldozerBSG писал(а):А вот собственно кусочек статьи (http://citforum.ru/nets/articles/ping/) как раз все объясняет как пользоватся

Использование Indy

Те, кто не знакомы с практикой программирования с использованием Windows API, могут воспользоваться встроенными в Delphi компонентами для работы с сетью. В частности, для реализации пинга на уровне объектно-ориентированного программирования воспользуемся компонентом IdICMPClient из состава Indy.

Для этого создадим сначала на пустой форме экземпляр класса TIdICMPClient, перетащив его с палитры компонентов Indy Clients. Затем поместим на форму стандартную кнопку (TButton) и в ее реакции на нажатие мышкой запишем код:

Код: Выделить всё

Self.IdIcmpClient1.Host:='localhost';//вместо 127.0.0.1 здесь можно использовать имя "localhost"
Self.IdIcmpClient1.Ping;
И не забудем выставить соответствующий интервал ожидания ответа, по завершении которого (или при получении данных от пингуемого) вызывается обработчик:

Код: Выделить всё

TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:TReplyStatus);
- в котором мы реализуем вывод данных пинга на экран:

Код: Выделить всё

procedure TForm1.IdIcmpClient1Reply (ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
ListBox1.Items.Add ('Reply:'+IntToStr (AReplyStatus.MsRoundTripTime));
end;

Так вообще не пингует, по окончании пинга выводит время заданное у IdIcmpClient1 в receiveTimeout,
Вот вам исходник. Первый IP - комп подключенный напрямую; второй IP - комп подключенный через маршрутизатор. Может есть другие более толковые компоненты для пинга?
Вложения
Ping..zip
(5.79 КБ) 29 скачиваний
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Есть еще вариант: маршрутизатор не пропускает ICMP пакеты.
Прверте что бы в консоле через комманду "ping" пинговался.
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

Пуск -> Выполнить -> cmd
ping 77.108.196.132

Обмен пакетами с 77.108.196.132 по 32 байт:

Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.

Статистика Ping для 77.108.196.132:
Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь),

Не пропускает :(
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Shouldercannon писал(а):Пуск -> Выполнить -> cmd
ping 77.108.196.132

Обмен пакетами с 77.108.196.132 по 32 байт:

Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.

Статистика Ping для 77.108.196.132:
Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь),

Не пропускает :(

Вот собственно корень проблемы. :)

p.s. пакеты могут не пропускать и firewall-ы тоже на какой либо стороне. надо копать... что и как...
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

Хз а какже другие "пингёры"? Например при просмотре списка игровых серверов там всё нормально не смотря на Firewall.
Ответить