Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 12:04   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Восклицание Определить пинг

Как определить пинг удалённого компьютера подключенного через роутер (маршрутизатор)? Не предлагать IdIcmpClient и всё что с ним связано, так как он ничего не получает.
Shouldercannon вне форума Ответить с цитированием
Старый 25.05.2011, 16:38   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А никак, если админ маршрутизатора запретил трансляцию ICMP-пакетов.
Но это редкость, хотя и встречается (из соображений безопасности, например).
Впрочем если хост за маршрутизатором успешно пингуется средствами, например, штатной ping-утилиты, значит следует обратить внимание на св-во TIdICMP.Bindings - вероятно пингуешь ты совсем с другого сет.интерфейса, нежели тот который гонит внешние пакты через шлюз, сопряженный с тем самым маршрутизатором.
mss вне форума Ответить с цитированием
Старый 25.05.2011, 17:40   #3
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

текст взят с делфиворлд

Протокол Ping предназначен для тестирования компьютерных соединений в Интернете путём посылки через протокол Internet Protocol (IP) по обределённому адресу сообщения и ожидания от него ответа.

ICMP - Internet Control Message Protocol. ICMP служит для передачи сообщений об ошибках а так же управляющих сообщений . ICMP-тест может показать насколько быстро проходит информация между двумя узлами в Интернете.

Запускаем Delphi;
В Новом проекте добавляем в форму Tbutton, Tedit и Tmemo;
Вставляем “winsock”;
объявляем структурку для IP-заголовка:


Код:
type
  IPINFO = record
  Ttl: char;
  Tos:har;
  IPFlags: char;
  OptSize: char;
  Options: ^char;
end;
объявляем структурку для хранения ICMP пакета:

Код:
type 
  ICMPECHO = record 
  Source: longint; 
  Status: longint; 
  RTTime: longint; 
  DataSize: Shortint; 
  Reserved: Shortint; 
  pData: ^variant; 
  i_ipinfo: IPINFO; 
end;
Объявляем функции и процедуры, которые мы будем вызывать из ICMP.DLL

Код:
TIcmpCreateFile = function():integer;
{$IFDEF WIN32} stdcall; {$ENDIF}

TIcmpCloseHandle = procedure(var handle: integer);
{$IFDEF WIN32} stdcall; {$ENDIF}

TIcmpSendEcho = function(var handle: integer; endereco: DWORD;
buffer: variant; tam: WORD; IP: IPINFO; ICMP: ICMPECHO;
tamicmp: DWORD; tempo: DWORD): DWORD;
{$IFDEF WIN32} stdcall; {$ENDIF}

В TButton в событие Onclick вставляем следующий код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  wsadt : wsadata;
  icmp :icmpecho;
  HNDicmp : integer;
  hndFile :integer;
  Host :PHostEnt;
  Destino :in_addr;
  Endereco :^DWORD;
  IP : ipinfo;
  Retorno :integer;
  dwRetorno :DWORD;
  x :integer;

  IcmpCreateFile : TIcmpCreateFile;
  IcmpCloseHandle : TIcmpCloseHandle;
  IcmpSendEcho : TIcmpSendEcho;

begin
  if (edit1.Text = '') then
  begin
    Application.MessageBox('Enter a HostName ro a IP Adress', 'Error', MB_OK);
    exit;
  end;
  HNDicmp := LoadLibrary('ICMP.DLL');
  if (HNDicmp <> 0) then
  begin
    @IcmpCreateFile := GetProcAddress(HNDicmp,'IcmpCreateFile');
    @IcmpCloseHandle := GetProcAddress(HNDicmp,'IcmpCloseHandle');
    @IcmpSendEcho := GetProcAddress(HNDicmp,'IcmpSendEcho');
    if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or (@IcmpSendEcho=nil) then
    begin
      Application.MessageBox('Error getting ICMP Adress’,'Error', MB_OK);
      FreeLibrary(HNDicmp);
    end;
  end;
  Retorno := WSAStartup($0101,wsadt);

  if (Retorno <> 0) then
  begin
    Application.MessageBox('Canґt Load WinSockets','WSAStartup', MB_OK);
    WSACleanup();
    FreeLibrary(HNDicmp);
  end;

  Destino.S_addr := inet_addr(Pchar(Edit1.text));
  if (Destino.S_addr = 0) then
    Host := GetHostbyName(PChar(Edit1.text))
  else
    Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);

  if (host = nil) then
  begin
    Application.MessageBox('Host not found','Error', MB_OK);
    WSACleanup();
    FreeLibrary(HNDicmp);
    exit;
  end;
  memo1.Lines.Add('Pinging ' + Edit1.text);

  Endereco := @Host.h_addr_list;

  HNDFile := IcmpCreateFile();
  for x:= 0 to 4 do
  begin
    Ip.Ttl := char(255);
    Ip.Tos := char(0);
    Ip.IPFlags := char(0);
    Ip.OptSize := char(0);
    Ip.Options := nil;

    dwRetorno := IcmpSendEcho(
    HNDFile,
    Endereco^,
    null,
    0,
    Ip,
    Icmp,
    sizeof(Icmp),
    DWORD(5000));
    Destino.S_addr := icmp.source;
    Memo1.Lines.Add('Ping ' + Edit1.text);
  end;

  IcmpCLoseHandle(HNDFile); 
  FreeLibrary(HNDicmp); 
  WSACleanup();
end;


У данного примера есть один недостаток - программа не воспримет доменное имя, только IP-адресс. Для пользователей NT не используйте функцию IcmpCloseHandle.

Это всё…..
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 26.05.2011, 09:16   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Я же говорю, что IdIcmpClient не может пинговать компьютер находящийся за маршрутизатором. К тому же работа кода всегда завершается ошибкой
Изображения
Тип файла: gif error.gif (7.7 Кб, 152 просмотров)

Последний раз редактировалось Shouldercannon; 26.05.2011 в 09:20.
Shouldercannon вне форума Ответить с цитированием
Старый 26.05.2011, 17:15   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
IdIcmpClient не может пинговать компьютер находящийся за маршрутизатором
Глупости, расчудесно пингует он.
mss вне форума Ответить с цитированием
Старый 26.05.2011, 17:31   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Глупости, расчудесно пингует он.
Попробуйте попингуйте меня 77.108.194.247. Нахожусь за маршрутизатором.

Последний раз редактировалось Shouldercannon; 26.05.2011 в 17:35.
Shouldercannon вне форума Ответить с цитированием
Старый 26.05.2011, 18:13   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> 77.108.194.247

ну пингуется ваш (или уже не ваш, т.к. айпи динамический) роутер, и чё?

Цитата:
<damned> kastor, попингуй!
<kastor> Слыш, сам попингуй!
<damned> От попингуя слышу!
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.05.2011, 18:44   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Это мой и он не динамический. А этот 77.108.196.132 получится запинговать?
Пингуете через ping.exe встроенный в Windows?

Последний раз редактировалось Shouldercannon; 26.05.2011 в 18:48.
Shouldercannon вне форума Ответить с цитированием
Старый 26.05.2011, 18:49   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Это мой и он не динамический

Цитата:
pool-194-247.ptcomm.ru [77.108.194.247]
слово pool в имени обычно означает, что айпишнег взят из общедоступного провайдерского пула, сегодня он у Пети, завтра у Васи. Хотя, может у вас он жоско привязан, такое тоже бывает.

> А этот 77.108.196.132 получится запинговать?

пока нет. Если это роутер, то он или выключен, или ответ на пинг у него залочен. Если это комп, то он, скорей всего, выключен )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.05.2011, 19:36   #10
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Это мой и он не динамический



слово pool в имени обычно означает, что айпишнег взят из общедоступного провайдерского пула, сегодня он у Пети, завтра у Васи. Хотя, может у вас он жоско привязан, такое тоже бывает.

> А этот 77.108.196.132 получится запинговать?

пока нет. Если это роутер, то он или выключен, или ответ на пинг у него залочен. Если это комп, то он, скорей всего, выключен )
Он включен. Скорее всего защита.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пинг в зоне рф Баламут Свободное общение 20 02.12.2010 12:48
Пинг понг (паскаль) Katmai Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 29.10.2010 22:59
Пинг-понг Ckomoroh Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 27.08.2010 18:33
windowsский пинг в linuxе Bat{CMD}_Men Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 2 11.03.2010 16:14