Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
1

Мониторинг сети

15.10.2017, 10:40. Просмотров 1207. Ответов 10
Метки нет (Все метки)


Здравствуйте! Имеется база данных с сведениями об оборудовании (в частности ip адреса).Нужно извлечь эти адреса из БД и отправить запросы в локальную сеть по этим адресам и получить ответ. На основе этих ответов определить состояния оборудования. Некое подобие мониторинга сети.

Подключил БД к С++ Bulder,нужно извлечь ip адрес из БД и передать запрос оборудованию и получить или не получить ответ, с помощью чего это реализовывать?

К Примеру в БД имеется 3 адреса извлекаю их с помощью цикла если так можно for (i=первая запись, i==последняя запись, i++ )
Далее исходя из извлеченных адресов отправляю запросы оборудованию и получаю ответы и на основании ответов определяю состояние.

При нажатии на кнопу отправлять запросы по бесконечному циклу с определенной периодичностью, пока принудительно кнопкой не остановят . Принимается ответ проверяется через некоторое условие. Если ответ получен или не получен или ответ от
коммутатора не получен покрасить соответствующие строки в соответствующие цвета.

Как это можно реализовать, какими методами,функциями,событиями пользоваться?

Добавлено через 12 часов 11 минут
Нашел реализацию Ping работает. Как реализовать извлечение из таблицы значения IP адреса (текстовый формат поля) и передать его значения Пингу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
for(int i=0; i==DataModule2->ADOTable_Hardware->RecordCount; i++) 
{ 
     DataModule2->ADOTable_Hardware->FieldByName("IP_address")->AsAnsiString; 
} 
//-------------------------------------------------------------------------— 
 
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
     ListBox1->Items->Clear(); 
     IdIcmpClient1->Host=Edit1->Text; 
     for(int i=1; i<=4; i++) 
 
try 
{ 
    IdIcmpClient1->Ping(); 
    Sleep(1000); 
    Application->ProcessMessages(); 
} 
catch(...) 
{ 
    ListBox1->Items->Add("Ping failed!"); 
    Application->ProcessMessages(); 
} 
} 
//-------------------------------------------------------------------------— 
 
void __fastcall TForm1::IdIcmpClient1Reply(TComponent *ASender, TReplyStatus * const AReplyStatus) 
{ 
    UnicodeString Result; 
    Result="Received" + UnicodeString(AReplyStatus->BytesReceived)+
    "bytes from" + AReplyStatus->FromIpAddress + 
    ",time =" + UnicodeString(AReplyStatus->MsRoundTripTime)+ 
    "ms,ttl =" + UnicodeString((int)AReplyStatus->TimeToLive); 
    ListBox1->Items->Add(Result); 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2017, 10:40
Ответы с готовыми решениями:

Мониторинг локальной сети (курсовик)
Подскажите плз как отобразить MAС адреса на всех компьютерах в локальной сети стандартными...

Мониторинг
Здравствуйте. Подскажите, каким способом можно осуществить мониторинг папки на предмет изменений в...

мониторинг кэша
существует некий operayting system cache располагается он в оперативной памяти в него заносится...

мониторинг файлов
Добрый вечер! В моей программе есть три ричедита, в которые загружаются различные файлы. Как мне...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
10
Модератор
6760 / 4354 / 1869
Регистрация: 21.01.2014
Сообщений: 18,421
Записей в блоге: 3
15.10.2017, 14:49 2
Цитата Сообщение от Игорь96 Посмотреть сообщение
Как это можно реализовать, какими методами,функциями,событиями пользоваться?
Прежде всего хотелось бы знать, какую БД Вы используете? Как и в каком виде Вы записываете туда данные?
0
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
15.10.2017, 16:10  [ТС] 3
БД Access 2007. Ip адреса хранятся в текстовом типе данных. Подключил БД с использованием компонентов ADO. Пока хочу их считать из БД и передать пингу.

Добавлено через 23 минуты
C++
1
2
3
4
for(int i=0; i==DataModule2->ADOTable_Hardware->RecordCount; i++) 
{ 
     DataModule2->ADOTable_Hardware->FieldByName("IP_address")->AsAnsiString; 
}
Вроде так реализуется извлечение из таблицы значения IP адреса.Теперь нужно записать значение поля в переменную и передать ее в пинг.
0
698 / 490 / 126
Регистрация: 31.05.2013
Сообщений: 2,730
Записей в блоге: 3
15.10.2017, 17:12 4
Цитата Сообщение от Игорь96 Посмотреть сообщение
for(int i=0; i==DataModule2->ADOTable_Hardware->RecordCount; i++)
Так делать нельзя....потому когда в таблице много значений, RecordCount возвращается частями к примеру по 50шт, делать надо ка кто так:
C++
1
2
3
4
5
6
        ADOTable_Hardware->First();
        while (!ADOTable_Hardware->Eof)
        {
            /*Ваш код*/
            ADOTable_Hardware->Next();
        }
0
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
15.10.2017, 22:11  [ТС] 5
Спасибо. Я вот не знаю как мне значения поля IP_address передать в переменную для дальнейшей передачи в пинг.
0
698 / 490 / 126
Регистрация: 31.05.2013
Сообщений: 2,730
Записей в блоге: 3
15.10.2017, 22:17 6
Это вот странно, так как Вы сразу перепрыгнули с основ сразу в работу с БД.
Собирайте в TStringList полученные ip, и по ним пингуйте.
0
Модератор
6760 / 4354 / 1869
Регистрация: 21.01.2014
Сообщений: 18,421
Записей в блоге: 3
16.10.2017, 07:54 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <memory>
//Получаем список IP
  std::auto_ptr<TStringList> L (new TStringList);
  DataModule2->ADOTable_Hardware->First();
  while (!DataModule2->ADOTable_Hardware->Eof)
    {
        L->Add(DataModule2->ADOTable_Hardware->FieldByName("IP_address")->AsString);
        DataModule2->ADOTable_Hardware->Next();
    }
//Идем по списку  
 for(int i = 0; i < L->Count; i++)
   {
       IdIcmpClient1->Host = L->Strings[i];
       //Далее получение пинга
       ...
   }
1
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
16.10.2017, 14:17  [ТС] 8
Спасибо большое
0
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
18.10.2017, 23:43  [ТС] 9
Здравствуйте.Хотел спросить как можно реализовать замену значения в таблицы в конкретном поле? Есть таблица в нее записываются значения переменной Result1, но каждый раз создается новая строка с новым номером.Как произвести запись в существующею строку что-бы номер у нею остался прежний. Наверно нужно удалять старое значение поля, но как удалить значение именно поля или может есть функция замены значения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
while(stop_thread)
        {
            ListBox1->Items->Clear();
            ListBox2->Items->Clear();
            TStringList *myList = new TStringList;
            DataModule2->ADOTable_Hardware->First();
        while(!DataModule2->ADOTable_Hardware->Eof && stop_thread==true)
            {
                myList->Add(DataModule2->ADOTable_Hardware->FieldByName("IP_address")->AsAnsiString);
                DataModule2->ADOTable_Hardware->Next();
            }
            for(int i = 0; i < myList->Count && stop_thread==true; i++)
                {
                    IdIcmpClient1->Host = myList->Strings[i];
 
                        for(int i=1; i<=Col && stop_thread==true ; i++)
                            {
                                try
                                    {
                                        IdIcmpClient1->Ping();
                                        Sleep(1000);
                                        Application->ProcessMessages();
 
                                    }
                                catch(...)
                                    {
 
                                    }
                              Result1=Result1+Result;
                            }
 
                    Result1=Result1/Col;
 
                    ListBox2->Items->Add(Result1);
                    DataModule2->ADOTable1->Insert();
                    DataModule2->ADOTable1->FieldByName("BytesReceived")->AsInteger=Result1;
                    Result1=0;
                }
        }
0
Модератор
6760 / 4354 / 1869
Регистрация: 21.01.2014
Сообщений: 18,421
Записей в блоге: 3
19.10.2017, 05:22 10
Цитата Сообщение от Игорь96 Посмотреть сообщение
как можно реализовать замену значения в таблицы в конкретном поле?
В любой таблице БД должно присутствовать поле, содержащее уникальные значения, так называемое ключевое поле. Оно служит:
1. Для однозначной идентификации каждой записи в таблице БД
2. Для установления связей между таблицами БД
Вот на основании этого ключевого поля и надо делать замену примерно такой вот инструкцией SQL:
SQL
1
UPDATE [Your_Table_Name] SET [Your_Field_Name] = [New_Value] WHERE [Your_Key_Field_Name] = [Value_For_Selection]
Например: в БД есть таблица с именем tab_Names и ключевым полем ID
IDNameMore_Info
1ВаcяБла-бла-бла
2ВаняБла-бла-бла
3ПетяБла-бла-бла
и Вы хотите изменить имя Ваня. Для этого пишем:
SQL
1
UPDATE tab_Names SET Name = 'Иван Иванович' WHERE ID = 2
1
0 / 0 / 1
Регистрация: 07.03.2014
Сообщений: 33
19.10.2017, 19:25  [ТС] 11
Спасибо большое! Хотел еще спросить как реализовать закрашивание строки DBGrid? То есть у меня есть некоторое значение переменной.Она проверяется условием и закрашивается в соответствующий цвет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
int Bytes,Bytes_medium;
int Timing,Timing_medium;
int Ttl,Ttl_medium;
int Col=4;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    stop_thread=true;
    Button1->Enabled=false;
    Button2->Enabled=true;
    while(stop_thread)
        {
            ListBox1->Items->Clear();
            ListBox2->Items->Clear();
            TStringList *myList = new TStringList;
            DataModule2->ADOTable_Hardware->First();
        while(!DataModule2->ADOTable_Hardware->Eof && stop_thread==true)
            {
                myList->Add(DataModule2->ADOTable_Hardware->FieldByName("IP_address")->AsAnsiString);
                DataModule2->ADOTable_Hardware->Next();
            }
            for(int i = 0; i < myList->Count && stop_thread==true; i++)
                {
                    IdIcmpClient1->Host = myList->Strings[i];
 
                        for(int i=1; i<=Col && stop_thread==true ; i++)
                            {
                                try
                                    {
                                        IdIcmpClient1->Ping();
                                        Sleep(1000);
                                        Application->ProcessMessages();
 
                                    }
                                catch(...)
                                    {
 
                                    }
                              Bytes_medium = Bytes_medium+Bytes;
                              Timing_medium = Timing_medium+Timing;
                              Ttl_medium = Ttl_medium+Ttl;
                            }
 
                    Bytes_medium = Bytes_medium/Col;
                    Timing_medium = Timing_medium/Col;
                    Ttl_medium = Ttl_medium/Col;
 
                    ListBox2->Items->Add(Bytes_medium);
                    ListBox2->Items->Add(Timing_medium);
                    ListBox2->Items->Add(Ttl_medium);
                                        //DBGrid_Hardware->DefaultDrawColumnCell()
                    Bytes_medium = 0;
                    Timing_medium = 0;
                    Ttl_medium = 0;
                }
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::IdIcmpClient1Reply(TComponent *ASender, TReplyStatus * const AReplyStatus)
{
    Bytes = AReplyStatus->BytesReceived;
    Timing = AReplyStatus->MsRoundTripTime;
    Ttl = AReplyStatus->TimeToLive;
    ListBox1->Items->Add(Bytes);
    ListBox1->Items->Add(Timing);
    ListBox1->Items->Add(Ttl);
}
 
void __fastcall TForm1::DBGrid_HardwareDrawColumnCell(TObject *Sender, const TRect &Rect,
          int DataCol, TColumn *Column, TGridDrawState State)
{
    if(Bytes_medium==0)
    {
    DBGrid_Hardware->Canvas->Brush->Color = clSilver; // меняется цвет фона
    //DBGrid_Hardware->DefaultDrawColumnCell(Rect, DataCol, Column, State);// перерисовка
    }
}
Я думал может вызывать перерисовку в цикле до обнуления соответствующий переменной, но как вызвать данный метод DefaultDrawColumnCell?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2017, 19:25

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Мониторинг загрузки процессора
всем доброго времени суток! меня интересует такой вопросик ... как программно в какой нибудь...

Мониторинг дискового пространства
Доброго времени суток! Подскажите, как можно реализовать в Builder C++, следующее: Проверка...

Мониторинг системного трея
Приветствую. У меня необычная задача. Есть приложение, которое при отключении инета меняет свою...

Мониторинг сети и серверов
Ребят, нубу нужна помощь. Так сложилось, что нужно написать программу, которая будет мониторить...

Мониторинг сети, и замена данных от некоторых URL
Мне нужно как-то на C++ написать программу, которая будет на компьютере отлавливать все соединения...

Мониторинг процессов
Подскажите как реализовать следующее: Программа, что ведет протокол действий пользователя с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.