Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: сканирую локальную сеть  (Прочитано 7396 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Zlatoust
Интересующийся

ua
Offline Offline

« : 24-02-2011 14:25 » 

Добрый день, Знатоки!
Пишу под ХР, на Borland C++ 6.0,
в программе хочу просканировать сеть и определить IP  и имена компов, которые сейчас находятся в on-line.

пример кода:

Код: (Text) с++
hostent* hn;
char far *kadr = {"10.61.125.194"};
AnsiString v;
int i, j;
 ...
 ...
IdIcmpClient1->Host=Grid1->Cells[1][i];                           //список IP адресов сидит в Grid1->Cells[1][i]
IdIcmpClient1->Ping();
if(IdIcmpClient1->ReplyStatus.ReplyStatusType==rsEcho && IdIcmpClient1 ->ReceiveTimeout>0)
  {
     Grid2->Cells[1][j] = Grid1->Cells[1][i];
     
      v      = Grid2->Cells[1][j];
      kadr = v.c_str();
          a = inet_addr ( kadr );
        hn = gethostbyaddr ((char* )&a, 4, AF_INET);
        Grid2->Cells[2][j] = (hn->h_name);
}

Проблема 1:

если оставляю последнюю строку кода " Grid2->Cells[2][j] = (hn->h_name);" , то программа вылетает на этой строке
                 с комментарием
                 Proect xxx raised exception class EAccessViolation with message 'Access violation at adress 00401D17 in module xxx.

если комментирую последнюю строку кода " Grid2->Cells[2][j] = (hn->h_name);" , то программа работает, но имен компов я не вижу.

Проблема 2:

если не меняю IP адрес, т.е. переменная kadr  константа, то программа работает с последней строкой кода, т.е.
пишет имя компа в Grid2->Cells[2][j] = (hn->h_name); , но имя компа одно и тоже, поскольку IP не меняю

помогите пожалуйста найти ошибку
« Последнее редактирование: 24-02-2011 14:59 от RXL » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-02-2011 14:39 » 

Проверьте значение hn на null.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Zlatoust
Интересующийся

ua
Offline Offline

« Ответ #2 : 24-02-2011 14:52 » 

спасибо большое!
все работает!
мучался 2 дня.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 24-02-2011 19:14 » 

Чтобы впредь не мучиться, возьмите за правило перед каждым разыменованием указателя обязательно добавлять:
Код: (C)
ASSERT(hn != NULL);
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Zlatoust
Интересующийся

ua
Offline Offline

« Ответ #4 : 25-02-2011 04:17 » 

Благодарю за науку!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines