Сбор и хранение MAC адресов коммутаторов Cisco Catalyst с возможностью обращения к базе данных в которой они хранятся.

Заказать уникальную дипломную работу
Тип работы: Дипломная работа
Предмет: Программирование
  • 59 59 страниц
  • 20 + 20 источников
  • Добавлена 01.06.2010
2 500 руб.
  • Содержание
  • Часть работы
  • Список литературы
  • Вопросы/Ответы
Введение
Глава1 Анализ существующих подходов к решению данной проблемы
Коммутаторы
1.1.Подход первый – CommView
1.2.Подход второй – 10-Страйк: Мониторинг Сети
1.3.Подход третий – NETMON от RINET Software Team
1.4.Подход четвертый – Arpwatch под *nix.
1.5.Подход, реализуемый в дипломе
Глава2 Разработка архитектуры программы
2.1 Выбор средств программирования
2.2. Описание алгоритма работы
Оконный интерфейс программы
Глава 3 Особенности программной реализации используемых алгоритмов программы и пример реализации
Глава 4 Анализ результатов
Заключение
Список использованной литературы
Электроные ресурсы

Фрагмент для ознакомления

Tables[tableName].NewRow();
DataRow newrow = MetroDS.Tables[tableName2].NewRow();
newrow["deviceId"] = id;
newrow["IP_ADDRESS"] = IPAddress;
newrow["COMMUNITY"] = Community;
newrow["INTERVAL"] = interval;


MetroDS.Tables[tableName2].Rows.Add(newrow);
this.dAdapt.Update(MetroDS, tableName2);
MetroDS.Tables[tableName2].AcceptChanges();


Console.WriteLine("device updated successfully");
}
catch (SqlException ex)
{
Console.WriteLine(string.Format("An exception of type {0} has been generated. The error message generated in {1}",
ex.GetType(),
ex.Message));
MessageBox.Show("Cannot save data into the Database ", "Save data error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}
finally
{
cn.Close();
Console.ReadLine();
}
}
/**
* Gets the device Id
*/
public int getDeviceId()
{

cn.ConnectionString = this.connectString();
int id = 0;
try
{
cn.Open();
dAdapt = new SqlDataAdapter("Select max (deviceId) as maxid from device", conString);

// Create a new DataTable
DataTable dtResult = new DataTable();

// Fill the DataTable with the result of the SQL statement
dAdapt.Fill(dtResult);

// Loop through all entries
foreach (DataRow drRow in dtResult.Rows)
{
if (!(drRow["maxid"].ToString()).Equals(""))
id = Convert.ToInt32(drRow["maxid"].ToString());
}

id = id + 1;

return id;
Console.WriteLine("device Id returned successfully");
}
catch (SqlException ex)
{
Console.WriteLine(string.Format("An exception of type {0} has been generated. The error message generated in {1}",
ex.GetType(),
ex.Message));
MessageBox.Show("Cannot get data from the Database ", "Save data error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
cn.Close();
Console.ReadLine();

}
return id;
}

/**
* Deletes the device from database.
*/
public void DeleteDevice( int Id)
{

cn.ConnectionString = this.connectString();
string del = @"delete from device where deviceId = " + Id;
try
{
cn.Open();


MetroDS = new DataSet("Metro");
dAdapt = new SqlDataAdapter("Select * from device", conString);
dAdapt.Fill(MetroDS, tableName2);
builderTCurrent = new SqlCommandBuilder(dAdapt);
DataTable dt = MetroDS.Tables[tableName2];

string strSQL = "delete from device where deviceId = " + Id;
SqlCommand objCommand2 = new SqlCommand(strSQL, cn);
SqlDataAdapter adapter2 = new SqlDataAdapter(objCommand2);
adapter2.Fill(MetroDS, tableName2);

adapter2.Update(MetroDS, tableName2);
MetroDS.Tables[tableName2].AcceptChanges();

Console.WriteLine("device updated successfully");
}
catch (SqlException ex)
{
Console.WriteLine(string.Format("An exception of type {0} has been generated. The error message generated in {1}",
ex.GetType(),
ex.Message));
MessageBox.Show("Cannot delete data from the Database ", "delete data error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}
finally
{
cn.Close();
Console.ReadLine();
}
}

public string DBHost
{
get
{
return host;
}
set
{
host = value.ToString();
}
}

public string DBName
{
get
{
return dbname;
}
set
{
dbname = value.ToString();
}
}

public string DBUser
{
get
{
return dbUser;
}
set
{
dbUser = value.ToString();
}
}

public string DBPass
{
get
{
return dbPass;
}
set
{
dbPass = value.ToString();
}
}
}
}



file smnThreadRequest.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using SnmpSharpNet;
using System.Threading;
using System.Windows.Forms;


namespace Myproject
{
class SnmpThreadRequest
{

Object locker = new Object();

private DateTime timeRequest;

private string macAddress;
private int interval = 0;
private string port = "";
public ListView lvwReceivedMessages;
private dbConnect dbConnection = new dbConnect();
public List table;
private string ipAddress = "", communityString, oid;
private SnmpWalk walk;
public bool rep = false;
public delegate void AddListItem(String[] str);
public AddListItem respDelegate;

public void AddListItemResponse(String[] str)
{
ListViewItem item2 = new ListViewItem(str);
lvwReceivedMessages.Items.Add(item2);
}

// Constructor
public SnmpThreadRequest(String hostIp, String communityString, int intervalTime,
string dbConStr,ListView lv )
{
this.ipAddress = hostIp;
this.communityString = communityString;
this.interval = intervalTime;
lvwReceivedMessages = new ListView();

dbConnection.setConString( dbConStr );
lvwReceivedMessages = lv;
}

//Entry point of thread.
public void startRequest()
{
respDelegate = new AddListItem(AddListItemResponse);
do
{
Console.WriteLine("sending Snmp request on the host " + this.ipAddress + " with community string " + this.communityString);

try
{
this.rep = false;


{
lvwReceivedMessages.Invoke(respDelegate, new object[] { new string[] { DateTime.Now.ToString(), "Send request", this.ipAddress, " 1" } });
this.rep = this.sendRequest();
Thread.Sleep(TimeSpan.FromSeconds(5));
}
// Updates log information depending of the state of device.
if (this.rep == true)
lvwReceivedMessages.Invoke(respDelegate, new object[] { new string[] { DateTime.Now.ToString(), "Got response successfully", this.ipAddress, " 1" } });
else
{
lvwReceivedMessages.Invoke(respDelegate, new object[] { new string[] { DateTime.Now.ToString(), "No Response ", this.ipAddress, " 1" } });
lvwReceivedMessages.Invoke(respDelegate, new object[] { new string[] { DateTime.Now.ToString(), "Device is not in ready state", this.ipAddress, " 1" } });
}
// Delay interval time before to send the request again
Thread.Sleep(TimeSpan.FromMinutes(this.interval));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

} while (true);
}

public ListView getListV() {
return this.lvwReceivedMessages;
}


public bool sendRequest()
{

this.rep = true;
//Заполняем таблицу VLANs
oid = "1.3.6.1.4.1.9.9.46.1.3.1.1.2";
List vlans = new List();
walk = new SnmpWalk();
try
{
vlans = walk.GetOidList(communityString, ipAddress, oid);

}
catch (SnmpException ex)
{
Console.WriteLine(string.Format("An exception of type {0} has been generated. The error message generated in {1}",
ex.GetType(),
ex.Message));
this.rep = false;
return this.rep;
}
catch (Exception ex)
{

Console.WriteLine(ex.Message);
this.rep = false;
return this.rep;
}
/*finally
{
return this.rep;
}*/

List intVlan = new List();
// Cохранить все порты, которые принадлежат VLAN 1
foreach (string s in vlans)
{
string nvlan = s.Substring(oid.Length + 3);
nvlan = nvlan.Substring(0, nvlan.IndexOf('*') - 1);
int i = Convert.ToInt32(nvlan);
if (i != 1002 && i != 1003 && i != 1004 && i != 1005)
{
intVlan.Add(i);
}
}

foreach (int i in intVlan)
{
string cmnt =
string.Format("{0}@{1}", communityString, i);

//Заподняем d1
oid = "1.3.6.1.2.1.17.4.3.1.1";
Dictionary d11 = new Dictionary();
d11 = GetD1(cmnt, ipAddress, oid);

//Заполняем d2
oid = "1.3.6.1.2.1.17.4.3.1.2";
Dictionary d22 = new Dictionary();
d22 = GetD2(cmnt, ipAddress, oid);

//Заполняем d4
oid = "1.3.6.1.2.1.17.1.4.1.2";
Dictionary d44 = new Dictionary();
d44 = GetD4(cmnt, ipAddress, oid);

//Заполняем d6
oid = "1.3.6.1.2.1.31.1.1.1.1";
Dictionary d66 = new Dictionary();
d66 = GetD6(cmnt, ipAddress, oid);

//Заполняем d3
Dictionary d33 = new Dictionary();
d33 = GetD3(d11, d22);

//Заполняем d5
Dictionary d55 = new Dictionary();
d55 = GetD5(d33, d44);

//Заполняем d7
Dictionary d77 = new Dictionary();
d77 = GetD7(d55, d66);
// Соединить MAC-адреса к порту, на котором был прочитан адрес
foreach (KeyValuePair pair in d77)
{
dbConnection.updateTable(this.ipAddress, pair.Key, pair.Value, DateTime.Now.ToString());
}
}

return this.rep;

}

public Dictionary GetD1(string community, string ip, string oid)
{
Dictionary retDict = new Dictionary();
List mac = new List();
try
{
// Сохранить список всех MAC адресов, которые были извлечены на все порты, которые принадлежат VLAN 1
mac = walk.GetOidList(community, ip, oid);
}
catch (SnmpException e)
{
MessageBox.Show("Can not get MAC Address for Ip address :" + this.ipAddress, " error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return retDict;
}

Dictionary d1 = new Dictionary();

foreach (string s in mac)
{
string key = s.Substring(23);
key = key.Substring(0, key.IndexOf('*') - 1);
string val = s.Substring(s.IndexOf('*') + 2);

try
{
// Определяем МАС адрес:
d1.Add(key, val);
}
catch (ArgumentException e)
{
MessageBox.Show("Error cocured during the request ", " error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return retDict;
}
}
return d1;
}

public Dictionary GetD2(string community, string ip, string oid)
{
Dictionary retDict = new Dictionary();
List ports = new List();
try
{
// Cохранить порты для VLAN 1
ports = walk.GetOidList(community, ip, oid);
}
catch (SnmpException e)
{
MessageBox.Show("Can not get port for Ip address :" + this.ipAddress, " error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return retDict;
}
Dictionary d2 = new Dictionary();
foreach (string s in ports)

// определяем порт который относится к MAC адресу string key = s.Substring(23);
key = key.Substring(0, key.IndexOf('*') - 1);
string val = s.Substring(s.IndexOf('*') + 2);
d2.Add(key, val);
}
return d2;
}

public Dictionary GetD3(Dictionary dx, Dictionary dy)
{
Dictionary dz = new Dictionary();
foreach (KeyValuePair pair in dx)
{
string key = pair.Key;
if (dy.ContainsKey(key))
dz.Add(dx[key], dy[key]);
}
return dz;
}

public Dictionary GetD5(Dictionary dx, Dictionary dy)
{
Dictionary dz = new Dictionary();
foreach (KeyValuePair pair in dx)
{
string val = pair.Value;
if (dy.ContainsKey(val))
{
dz.Add(pair.Key, dy[val]);
}
}
return dz;
}

public Dictionary GetD4(string community, string ip, string oid)
{
Dictionary retDict = new Dictionary();
List ifindex = new List();
try
{
// Используем walk для того, чтобы соотнести ifIndex значение с правильным названием порта.
ifindex = walk.GetOidList(community, ip, oid);
}
catch (SnmpException e)
{
return retDict;
}
Dictionary d4 = new Dictionary();
foreach (string s in ifindex)
{

string key = s.Substring(oid.Length + 1);
key = key.Substring(0, key.IndexOf('*') - 1);
string val = s.Substring(s.IndexOf('*') + 2);
d4.Add(key, val);
}
return d4;
}

public Dictionary GetD6(string community, string ip, string oid)
{
Dictionary retDict = new Dictionary();
List ifname = new List();
try
{.
//Используем команду walk с ifName для того, чтобы соотнести ifIndex значение с правильным названием порта.
//
ifname = walk.GetOidList(community, ip, oid);
}
catch (SnmpException e)
{
return retDict;
}
Dictionary d6 = new Dictionary();
//С известного порта определяем номер ifIndex
foreach (string s in ifname)
{
string key = s.Substring(oid.Length + 1);
key = key.Substring(0, key.IndexOf('*') - 1);
string val = s.Substring(s.IndexOf('*') + 2);
d6.Add(key, val);
}
return d6;
}

private Dictionary GetD7(Dictionary dx, Dictionary dy)
{
// С известного ifIndex мы определяем соответствующий порт Fast Ethernet:
Dictionary dz = new Dictionary();
foreach (KeyValuePair pair in dx)
{
string val = pair.Value;
if (dy.ContainsKey(val))
{
dz.Add(pair.Key, dy[val]);
}
}
return dz;
}




file snmpwalk.cs
using System;
using System.Collections;
using System.Net;
using System.Collections.Generic;
using SnmpSharpNet;

namespace Myproject
{
class SnmpWalk
{
public SnmpWalk()
{
}

public List GetOidList(string strCommunity, string strIP, string strOid)
{
List res = new List();

OctetString community = new OctetString(strCommunity);
AgentParameters param = new AgentParameters(community);
param.Version = SnmpVersion.Ver1;
IpAddress agent = new IpAddress(strIP);
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1);
Oid rootOid = new Oid(strOid);

// This Oid represents last Oid returned by
// the SNMP agent
Oid lastOid = (Oid)rootOid.Clone();

// Pdu class used for all requests
Pdu pdu = new Pdu(PduType.GetNext);

// Loop through results
while (lastOid != null)
{
// When Pdu class is first constructed, RequestId is set to 0
// and during encoding id will be set to the random value
// for subsequent requests, id will be set to a value that
// needs to be incremented to have unique request ids for each
// packet
if (pdu.RequestId != 0)
{
pdu.RequestId += 1;
}
// Clear Oids from the Pdu class.
pdu.VbList.Clear();
// Initialize request PDU with the last retrieved Oid
pdu.VbList.Add(lastOid);
// Make SNMP request
SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param);
// You should catch exceptions in the Request if using in real application.

// If result is null then agent didn't reply or we couldn't parse the reply.
if (result != null)
{
// ErrorStatus other then 0 is an error returned by
// the Agent - see SnmpConstants for error definitions
if (result.Pdu.ErrorStatus != 0)
{
// agent reported an error with the request
Console.WriteLine("Error in SNMP reply. Error {0} index {1}",
result.Pdu.ErrorStatus,
result.Pdu.ErrorIndex);
lastOid = null;
break;
}
else
{
// Walk through returned variable bindings
foreach (Vb v in result.Pdu.VbList)
{
// Check that retrieved Oid is "child" of the root OID
if (rootOid.IsRootOf(v.Oid))
{
//Console.WriteLine("{0} ({1}): {2}",
// v.Oid.ToString(),
// SnmpConstants.GetTypeName(v.Value.Type),
// v.Value.ToString());
res.Add(v.Oid.ToString() + " * " + v.Value.ToString());
lastOid = v.Oid;
}
else
{
// we have reached the end of the requested
// MIB tree. Set lastOid to null and exit loop
lastOid = null;
}
}
}
}
else
{
Console.WriteLine("No response received from SNMP agent.");
}
}
target.Close();
return res;
}
}
}

Глава 4 Анализ результатов
После запуска программы пользователь видит главное окно программы.

Рисунок 4 - главное окно программы
Manager status -показывает статус менеджера
Manager closed — нет отправлений запросов к коммутатору.
Для запуски отправления запросов нужно нажать на кнопку «Start Manager»
Agents -В состав управляемой системы входит компонент, называемый агентом, который отправляет отчёты управляющей системе. По существу SNMP агенты передают управленческую информацию на управляющие системы как переменные (такие как «свободная память», «имя системы», «количество работающих процессов»
В списке агентов есть 10.200.228.58 и 10.200229.225.
Add Agent to List — Добавить агент в списки

Рисунок 5 — Окно добавления устройства
Device list — список устройства (Управление коммутаторов), т.е добавление удаление коммутаторов, т.е.IP адрес с интервалом времени;


Рисунок 6- Добавление устройства


Рисунок 7-Устройство добавлено.






Рисунок 9. Удаление устройства
Как показано на рисунке 9, для удаления устройства сначала выбирается устройство, а потом нажимается кнопку «Delete device».

Рисунок 10. запуск менеджера (отправление запросов)
Для запуска нажать на кнопку «Start Manager», после чего начинается отправление запросов на устройства c IP адрес 10.200.228.128
Broadcast Message показывает интерфейс для логов и отображает списки коммутаторов, которые опрашиваются, т.е Broadcast Message выводит информацию, как происходит отправление запросов и ответы на них, а также коммутаторы, которые опрошены удачно, IP адрес и время, тип запроса (отравление,ответ) и SNMP версии.


Рисунок 11.. Информация о полученных MAC адресах и портах после отправления запроса по IP адресу 10.200.228.128




Рис. 12. Конфигурация базы данных
Имя хоста (сервера), на котором размещена база данных Microsoft SQL Server
имя базы данных
Показывает имя базы данных, к которой устанавливается подключение.Чтобы использовать новую базу данных.
Имя пользователя
Предоставляет текстовое поле для ввода идентификатора пользователя.При открытии диалоговое окно входа, где предлагается ввести данный идентификатор пользователя для доступа к базе данных.Для успешного подключения администратор базы данных должен предварительно предоставить разрешение на доступ к базе данных.
Password
Предоставляет текстовое поле для ввода пароля.При открытии диалоговое окно входа, где предлагается ввести данный пароль для доступа к базе данных.Для успешного подключения администратор базы данных должен предварительно предоставить разрешение на доступ к базе данных.
Настройки подключения к базе данных .
«Get Table» - кнопка, после нажатия на которую данные полученные от коммутатора, записываются в Б.Д
Струтура БД для сохранения информации в БД
Таблица Device

deviceId int ,- Идентификатор устройсва
IP_ADDRESS char(17) — IP адрес устройсва
Community char(17), – Community строка
Interval int — Интервал времени по корому будет происходить отправление запросов

Таблица Information
DEVICEID int - Идентификатро устройства
IP_ADDRESS char(17) -IP адрес устройсва
MAC_ADDRESS char(17), - MAC адресс найден после отправления запроса которму соотвествует данному порту
PORT char(17) , -Порт найден после отправления запроса
TIME_REQUEST DATETIME — время по корому было сделан
запрос
Создание БД.
CREATE TABLE INFORMATIONS ( //Таблица для сохранения полученных информация
id int
IDENTITY(1,1)
PRIMARY KEY CLUSTERED,
device_id int NOT NULL REFERENCES DEVICE(id),
ip_address varchar(20) NOT NULL,
port varchar(50) ,
mac_address varchar(50) ,
time_request DATETIME NOT NULL
)
CREATE TABLE DEVICE // Таблица устройств
(
id smallint
IDENTITY(1,1)
PRIMARY KEY CLUSTERED,
ip_address_device varchar(20) NOT NULL,
interval_time_request int NOT NULL
)
Структура всех классов приведена на рис. 13.

Рис. 13. Структура классов БД
Заключение

В локальных сетях часто возникает проблема распределения адресов. Многие люди пытаются получить неправильные или просто понравившиеся адреса.  Если эти адреса в данное время не заняты (компьютеры-владельцы выключены), то им это удается, и настоящий владелец не может получить свой адрес. Таким образом, могут пострадать многие сетевые сервисы, так как адресация происходит именно по IP. Большинство брандмауэров также работает на уровне IP адресов, то есть произойдет подмена компьютеров, и защитные правила не будут работать для конкретной машины.
Основным резальтатом работы является создание программного обеспечения, которое осуществляет поиск хоста по MAC адресу. Созданную программу можно использовать для работы в локальной сети предприятия.
Список использованной литературы
Троелсен Э. C# и платформа .NET. Библиотека программиста. – Спб.: Питер, 2002.
Оньон Ф. Основы ASP.NET с примерами на C#. – М.: Вильямс, 2003.
Волоха А.В. Microsoft SQL Server 2005. Новые возможности. – Спб.: Питер, 2006.
Митчелл С., Уолтер С., Севен Д. ASP.NET: советы, рекомендации, примеры. – М.: Вильямс, 2002.
Уилтон П. JavaScript. Основы. – Спб.: Символ-Плюс, 2002.
Сеппа Д. Microsoft ADO.NET. – М.: Русская редакция, 2003.
Ши Д., Хольцшлаг М. Философия CSS-дизайна. – М.: НТ Пресс, 2005.
Матросов А., Сергеев А., Чаунин М. HTML 4.0 в подлиннике. – Спб.: BHV-Петербург, 2005.
Электроные ресурсы

Lubarsky A. Сложные графики и диаграммы в ASP.NET. Часть третья - HttpHandler/System.Drawing. http://aspnetmania.com/Articles/Article/42.html
Прохоров M. Сложные графики и диаграммы в ASP.NET. Часть четвёртая – ChartSpace. http://aspnetmania.com/Articles/Article/55.html
Веденин В. Работа с Crystal Report.NET. http://www.gotdotnet.ru/LearnDotNet/ NETFramework/85842.aspx
Добсон Р. Азы Reporting Services. Windows IT Pro #08/2005 (http://www.osp.ru/win 2000/2005/08/380209/)
Temnov O. Обработка ошибок в ASP.NET приложении. http://dotsite.ru/Publications/ Publication 152.aspx
Uvarov D. ASP.NET WebHandlers, или что такое .ashx файлы. http://dotsite.ru/ Publications/Publication150.aspx
Jenihov E. Частичная проверка правильности ввода данных. http://dotsite.ru/ Publications/Publication153.aspx
Митчелл С. Понимание состояния отображения ASP.NET. http://www.Ruemind ru/Text.aspx?ArticleId=385
Franke D. An Introduction to Microsoft SQL Server 2000 Reporting Services. http://aspnet 4guysfromrolla.com/articles/031605-1.aspx
Siddiqui M. A. HTTP Handlers and HTTP Modules in ASP.NET. http://www.5seconds com/issue/020417.htm
Mitchell S. Dynamic Controls in ASP.NET. http://aspnet.4guysfromrolla.om/articles 081402-1.aspx
Mitchell S. Dynamic Web Controls, Postbacks, and View State. http://aspnet.4guysfromrolla. om/articles/092904-1.aspx











2



Начало

I = 0

I <= N NNN55gggggggnnndgnn NNNNNN\NNNhNN NN

I = I +1

host = TableIP[i]
com = communityname
OID = .1.3.6.1.4.1.9.9.46.1.3.1.1.2


snmpwalk -c com host OID


Вывод MAC Address
Вывод Port


T = 0

T <= 300

T = T+1

Insert into macTable( id,MAcAdress,port, time_send)

1.Троелсен Э. C# и платформа .NET. Библиотека программиста. – Спб.: Питер, 2002.
2.Оньон Ф. Основы ASP.NET с примерами на C#. – М.: Вильямс, 2003.
3.Волоха А.В. Microsoft SQL Server 2005. Новые возможности. – Спб.: Питер, 2006.
4.Митчелл С., Уолтер С., Севен Д. ASP.NET: советы, рекомендации, примеры. – М.: Вильямс, 2002.
5.Уилтон П. JavaScript. Основы. – Спб.: Символ-Плюс, 2002.
6.Сеппа Д. Microsoft ADO.NET. – М.: Русская редакция, 2003.
7.Ши Д., Хольцшлаг М. Философия CSS-дизайна. – М.: НТ Пресс, 2005.
8.Матросов А., Сергеев А., Чаунин М. HTML 4.0 в подлиннике. – Спб.: BHV-Петербург, 2005.
Электроные ресурсы

9.Lubarsky A. Сложные графики и диаграммы в ASP.NET. Часть третья - HttpHandler/System.Drawing. http://aspnetmania.com/Articles/Article/42.html
10.Прохоров M. Сложные графики и диаграммы в ASP.NET. Часть четвёртая – ChartSpace. http://aspnetmania.com/Articles/Article/55.html
11.Веденин В. Работа с Crystal Report.NET. http://www.gotdotnet.ru/LearnDotNet/ NETFramework/85842.aspx
12.Добсон Р. Азы Reporting Services. Windows IT Pro #08/2005 (http://www.osp.ru/win 2000/2005/08/380209/)
13.Temnov O. Обработка ошибок в ASP.NET приложении. http://dotsite.ru/Publications/ Publication 152.aspx
14.Uvarov D. ASP.NET WebHandlers, или что такое .ashx файлы. http://dotsite.ru/ Publications/Publication150.aspx
15.Jenihov E. Частичная проверка правильности ввода данных. http://dotsite.ru/ Publications/Publication153.aspx
16.Митчелл С. Понимание состояния отображения ASP.NET. http://www.Ruemind ru/Text.aspx?ArticleId=385
17.Franke D. An Introduction to Microsoft SQL Server 2000 Reporting Services. http://aspnet 4guysfromrolla.com/articles/031605-1.aspx
18.Siddiqui M. A. HTTP Handlers and HTTP Modules in ASP.NET. http://www.5seconds com/issue/020417.htm
19.Mitchell S. Dynamic Controls in ASP.NET. http://aspnet.4guysfromrolla.om/articles 081402-1.aspx
20.Mitchell S. Dynamic Web Controls, Postbacks, and View State. http://aspnet.4guysfromrolla. om/articles/092904-1.aspx

Вопрос-ответ:

Какой подход к сбору и хранению MAC адресов коммутаторов Cisco Catalyst описывается в главе 1 статьи?

В главе 1 статьи описываются четыре подхода к сбору и хранению MAC адресов коммутаторов Cisco Catalyst: CommView, 10 Страйк Мониторинг Сети, NETMON от RINET Software Team и Arpwatch под nix.

Какие средства программирования были выбраны для разработки архитектуры программы по сбору и хранению MAC адресов коммутаторов Cisco Catalyst?

В главе 2 статьи описывается выбор средств программирования для разработки программы по сбору и хранению MAC адресов коммутаторов Cisco Catalyst. Необходимо прочитать главу 2 для получения подробностей.

Каковы особенности подхода CommView к сбору и хранению MAC адресов коммутаторов Cisco Catalyst?

Подход CommView, описанный в главе 1 статьи, позволяет собирать и хранить MAC адреса коммутаторов Cisco Catalyst, но не предоставляет возможность обращения к базе данных с этими адресами.

Каковы основные особенности подхода Arpwatch под nix к сбору и хранению MAC адресов коммутаторов Cisco Catalyst?

Подход Arpwatch под nix, описанный в главе 1 статьи, позволяет собирать и хранить MAC адреса коммутаторов Cisco Catalyst. Он представляет собой псевдографическую программу для отслеживания IP и MAC адресов в локальной сети.

Каково описание алгоритма работы программы по сбору и хранению MAC адресов коммутаторов Cisco Catalyst в главе 2 статьи?

Глава 2 статьи описывает архитектуру программы по сбору и хранению MAC адресов коммутаторов Cisco Catalyst, но подробности алгоритма работы не указаны. Рекомендуется прочитать главу 2 для получения более полной информации.

Какие подходы существуют для сбора и хранения MAC адресов коммутаторов Cisco Catalyst?

В статье рассматриваются четыре подхода: CommView, Страйк Мониторинг Сети, NETMON от RINET Software Team и Arpwatch под nix.

Что такое CommView?

CommView - это один из подходов для сбора и хранения MAC адресов коммутаторов Cisco Catalyst. Он позволяет анализировать трафик в сети и записывать MAC адреса коммутаторов.

Что такое Страйк Мониторинг Сети?

Страйк Мониторинг Сети - это еще один подход для сбора и хранения MAC адресов коммутаторов Cisco Catalyst. Он предоставляет возможность мониторинга сети и анализа трафика.

Что такое NETMON от RINET Software Team?

NETMON от RINET Software Team - это третий подход для сбора и хранения MAC адресов коммутаторов Cisco Catalyst. Эта программа предоставляет инструменты для мониторинга и анализа сетевого трафика.

Что такое Arpwatch под nix?

Arpwatch под nix - это еще один подход для сбора и хранения MAC адресов коммутаторов Cisco Catalyst. Он позволяет отслеживать изменения ARP таблицы и записывать MAC адреса коммутаторов.