C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Ping, Выдает ошибку при пинге имени несуществу
bacho_sun
  Отправлено: 21.01.2006, 21:06


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Вот взял за пример Пинг который дан в самом Builder С++ 6.0 с использованием компонента IdIcmpClient1.

Все бы хорошо, но когда я делаю пинг не существующего имени компьютера в локальной сети — например: ping dionis


То вместо того, чтобы выдать обычное сообщение что компьютера нет — не отвечает 0.0.0.0.... он выдает ошибку Socket Error Process Stopped и виснет


Как быть, что сделать чтобы просто выдавало сообщение о 0.0.0.0 или ничего не выдовало..но не выкидывало это ошибку.


Сделал так

try

{

ICMP->Host = edtHost->Text;



ICMP->Ping();



Application->ProcessMessages();

// Sleep(1000);

}

catch(ESocketError &SocketError)

{

return;

}

//ErrorCode=0;

Но все равно тоже самое

Помогите конкретным примером по мере возможности пожалуйста
Werti
Отправлено: 26.01.2006, 02:49


Дежурный стрелочник

Группа: Участник
Сообщений: 30




#include
#pragma hdrstop

#include "Unit1.h"
#include
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool stop=false;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
stop=false;
{
try
{
IdIcmpClient1->Host="192.168.10.150";
IdIcmpClient1->Ping();

if (IdIcmpClient1->ReplyStatus.FromIpAddress==IdIcmpClient1->Host & IdIcmpClient1->ReplyStatus.ReplyStatusType==rsEcho)
{
Form1->caption="ok";
}

}
catch(EIdSocketError& t)
{
//ListBox1->Items->Add(t.Message);
}
Application->ProcessMessages();
if (stop==true) break;
}
}

попробуй так компилировать времени не было но писал по памяти со своего проекта

Отредактировано Werti — 26/01/2006, 02:50
bacho_sun
  Отправлено: 28.01.2006, 18:32


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Извините что сразу не поблагодарил но меня просто не было
Большое спасибо вам за ответ.
К сожалению этот пример не сработал
Может что не так ?
Пробовал и так и сяк
Когда пингую имя не существующего компа в любом случае выкидывает ошибку, если можете помогите пожалуйста
Werti
Отправлено: 30.01.2006, 12:29


Дежурный стрелочник

Группа: Участник
Сообщений: 30



Прости недосматрел попробуй так
ESocketError &SocketError это то что ты пытался подсунуть в catch

а у меня она просто другая )
попробуй поставить catch блок так


catch(ESocketError& t)
{
//ListBox1->Items->Add(t.Message);
}
bacho_sun
Отправлено: 01.02.2006, 14:56


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Привет
Сделал все как ты сказал , но тоже самое ... выбивает ошибку при пинге имени не существующего компьютера.

Может ты посмотришь исходник самого Builder овского примера ?

Что только я не перепробовал, но...
Werti
Отправлено: 02.02.2006, 10:50


Дежурный стрелочник

Группа: Участник
Сообщений: 30



просто в твоём примере то что ты написал в самом первом посту я не вижу проверки

у тебя есть только пинг а проверки нету что тебе должен возвращать компонент ip хоста или его имя сматри внимательнее мой пример.

При пинге любого хоста дрпустим www.ru

от не вернёт тебе никогда ответ в виде www.ru
а это будет выглядеть так

Обмен пакетами с www.ru [194.87.0.50] по 32 байт:

Ответ от 194.87.0.50: число байт=32 время=7мс TTL=58
Ответ от 194.87.0.50: число байт=32 время=7мс TTL=58
bacho_sun
  Отправлено: 03.02.2006, 18:36


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Привет
Да нет же
Вот смотри, я просто пингую компьютер в локальной сети, который отключен от нее.
делаю ping dima например и все виснет.
а если сделаю пинг отключоннго компьютера но вместо имени напишу его IP адресс то все в порядке .. он напишет что его нет 0.0.0.0
но мне до ужаса нужно делать пинг не IP а именно имени.
я использую сам Билдеровский рабочий пример C:\Program Files\Borland\CBuilder6\Examples\Indy\PingGUI

Может есть выход , или может посоветуешь какойнибудь бесплатный компонент вместо билдеровского ? для Builder 6
Guest
Отправлено: 04.02.2006, 04:57


Не зарегистрирован







Хорошо попоже посматрю проект стандартный
Werti
Отправлено: 04.02.2006, 06:32


Дежурный стрелочник

Группа: Участник
Сообщений: 30



//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TTfrmPing *TfrmPing;
//---------------------------------------------------------------------------
__fastcall TTfrmPing::TTfrmPing(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TTfrmPing::btnPingClick(TObject *Sender)
{
int i;

ICMP->OnReply = ICMPReply;
ICMP->ReceiveTimeout = 1000;
btnPing->Enabled = False;

try
{
ICMP->Host = edtHost->Text;

for(i = 1; i <= 4; i++)
{
ICMP->Ping();
Application->ProcessMessages();
// Sleep(1000);
}
}
catch(EIdSocketError& t)
{
ListBox1->Items->Add(t.Message);
}
Application->ProcessMessages();



btnPing->Enabled = True;

}
//---------------------------------------------------------------------------
void __fastcall TTfrmPing::ICMPReply(TComponent *ASender,
const TReplyStatus &AReplyStatus)
{
AnsiString sTime, result[5];

// TODO: Check for error on ping reply (ReplyStatus->MsgType?)
if(AReplyStatus.MsRoundTripTime == 0)
{
sTime = "<1";
}
else
{
sTime = "=";
}

result[0] = IntToStr(AReplyStatus.BytesReceived);
result[1] = AReplyStatus.FromIpAddress;
result[2] = IntToStr((int)AReplyStatus.SequenceId);
result[3] = IntToStr((int)AReplyStatus.TimeToLive);
result[4] = sTime;
result[5] = IntToStr(AReplyStatus.MsRoundTripTime);

lstReplies->Items->Add(result[0] + " bytes from " + result[1] +
": icmp_seq=" + result[2] + " ttl=" + result[3] +
" time" + result[4] + result[5] + " ms");
}
//---------------------------------------------------------------------------

Это тебе полный исходник проекта с папки C:\Program Files\Borland\CBuilder6\Examples\Indy\PingGUI

Откомпилируй и запусти приложение которое откомпилировалось если уж совсем не поймешь могу прислать пример откомпилированый с исходником на почту удачи!!!.
Werti
Отправлено: 04.02.2006, 06:41


Дежурный стрелочник

Группа: Участник
Сообщений: 30



QUOTE (bacho_sun @ 03/02/2006, 18:36)
Привет
Да нет же
Вот смотри, я просто пингую компьютер в локальной сети, который отключен от нее.
делаю ping dima например и все виснет.
а если сделаю пинг отключоннго компьютера но вместо имени напишу его IP адресс то все в порядке .. он напишет что его нет 0.0.0.0
но мне до ужаса нужно делать пинг не IP а именно имени.
я использую сам Билдеровский рабочий пример C:\Program Files\Borland\CBuilder6\Examples\Indy\PingGUI

Может есть выход , или может посоветуешь какойнибудь бесплатный компонент вместо билдеровского ? для Builder 6

Для того что бы не висло добавь компонент с вкладки Indy Misc
IdAntiFreeze1 он там стоит самый верхний.



Guest
Отправлено: 04.02.2006, 11:44


Не зарегистрирован







QUOTE

делаю ping dima например и все виснет.
а если сделаю пинг отключоннго компьютера но вместо имени напишу его IP адресс то все в порядке .. он напишет что его нет 0.0.0.0
но мне до ужаса нужно делать пинг не IP а именно имени.

struct hostent *hret = gethostbyname(host_name.c_str());
Разрешит IP адрес по мени.
bacho_sun
  Отправлено: 05.02.2006, 13:25


Дежурный стрелочник

Группа: Участник
Сообщений: 33



ребята огромное спасибо , за помощь..
я взял этот исходник приведенный вами..и когда начал пинговать имя не существующего компа он опять выбил туже ошибку.
тоесть на имя он виснет а если пингую не существующий IP то не вистнет.
А вот преоброзование имени в ай пи и после пинг мне очень не выгоден в данном случае.
Просто очень нужно сделать обычный пинг и именно ИМЕНИ не существующего компьютера так, чтобы не выкидовало системной ошибки..а просто было ясно что его нет в сети и все.
Ребята помогите пожалуйста
bacho_sun
  Отправлено: 05.02.2006, 13:33


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Чуть не забыл
А как мне использовать IdAntiFreeze1 ? и может ли в данном случае это помочь ?
Guest
Отправлено: 05.02.2006, 18:16


Не зарегистрирован







QUOTE (bacho_sun @ 05/02/2006, 13:25)
ребята огромное спасибо , за помощь..
я взял этот исходник приведенный вами..и когда начал пинговать имя не существующего компа он опять выбил туже ошибку.
тоесть на имя он виснет а если пингую не существующий IP то не вистнет.
А вот преоброзование имени в ай пи и после пинг мне очень не выгоден в данном случае.
Просто очень нужно сделать обычный пинг и именно ИМЕНИ не существующего компьютера так, чтобы не выкидовало системной ошибки..а просто было ясно что его нет в сети и все.
Ребята помогите пожалуйста

Я же написал
откомпилируй и запусти exe а при
выполнении приложения во время компиляции он всё равно будет выдавать ошибку .
он перестанет её выдавать только тогда когда ты запустишь скомпилированый exe
и ошибку запишит в ListView1.
Уж так сложилось что ошибки в решими компиляции всегда показываються.
а антифриз просто кинь на форму и всё.
Gedeon
Отправлено: 05.02.2006, 18:24


Ветеран

Группа: Модератор
Сообщений: 1742



Можно отключить ошибки во время отладки, но это по моему не стоит делать
bacho_sun
Отправлено: 06.02.2006, 10:07


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Привет
Ребята огромное спасибо — сработало, просто я был не внимательным.
Моя вина.
Еще раз благодарю вас.
Werti
Отправлено: 06.02.2006, 14:03


Дежурный стрелочник

Группа: Участник
Сообщений: 30



О неужели хоть кому то я помог)
Guest
Отправлено: 06.02.2006, 18:41


Не зарегистрирован







QUOTE

А вот преоброзование имени в ай пи и после пинг мне очень не выгоден в данном случае.
Просто очень нужно сделать обычный пинг и именно ИМЕНИ не существующего компьютера ...

Странно ohmy.gif , просмотр исходников показывает
IDIcmpClient->Ping вызывает
Send(Host, Port, bufIcmp, iDataSize); вызывает
ResolveHost(AHost) вызывает
WSGetHostByName
что можно было сделать сразу. smile.gif
PS.
Нет способа пропинговать машину по имени, только по IP, для разрешения имен в адреса существуют специальные сервера и таблицы.
bacho_sun
Отправлено: 11.02.2006, 11:23


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Спасибо за предоставленную информацию
Я просто не знал
Благодарю

Вернуться в Вопросы программирования в C++Builder