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 |
А вот преоброзование имени в ай пи и после пинг мне очень не выгоден в данном случае.
Просто очень нужно сделать обычный пинг и именно ИМЕНИ не существующего компьютера ...
|
Странно , просмотр исходников показывает
IDIcmpClient->Ping вызывает
Send(Host, Port, bufIcmp, iDataSize); вызывает
ResolveHost(AHost) вызывает
WSGetHostByName
что можно было сделать сразу.
PS.
Нет способа пропинговать машину по имени, только по IP, для разрешения имен в адреса существуют специальные сервера и таблицы. |
|
bacho_sun |
Отправлено: 11.02.2006, 11:23 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
Спасибо за предоставленную информацию
Я просто не знал
Благодарю |
|