![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
1 - Получение MAC адреса сетевой карты / NetBIOS / Сеть |
![]() |
Шаг 1 - Получение MAC адреса сетевой картыПервое, что я хочу сказать по поводу этой темы. Я в ней совершенно не разбираюсь. То есть я делаю у себя сеть на предприятии на базе NT Server и она работает :-). Так же я считаю, что лучше понять как работает программное обеспечение можно только научившись программировать :-) все это обеспечение. Так что особенно не наезжайте :-). Это и мой первый шаг :-). Приму с большой благодарностью любую Вашу помошь и советы. Литературы по этому поводу не очень много. Давайте вместе. А ? MAC - Media Access Control это номер сетевой карты. Он зашивается в карту производителем и используется протоколами сети. Если у Вас NT, то Вы можете его увидеть вот как. Administrative tools -> Windows NT Diagnostic далее вкладка Network и кнопка Transport. Для решения этой задачи мы будем использовать функции Netbios. Вобщем мы попробуем, а потом я напишу поподробнее о NetBios. Создаем приложение Win 32 console с именем TestNet1 и выбираем Simple Application. Смотрим Project setting и далее Link все, что там есть нам не надо. А поместить туда надо - Netapi32.lib. Чтож давайте писать:-) ещебы знать чего. Ну надо знать заголовочный файл для этой библиотеки. Нам нужен NB30.H. Но он не будет компилироваться без windows.h в нем есть куча объявлений типа UCHAR и так далее. Вот на данную минуту как должны выглядеть объявления. #include "stdafx.h" #include "windows.h" #include "NB30.h" Нам нужна структура сетевого управляющего блока. Имя этой структуры NCB. Она содержит данные о каманде, буфер для сообщений и так далее. Вот она: typedef struct _NCB { // ncb UCHAR ncb_command; UCHAR ncb_retcode; UCHAR ncb_lsn; UCHAR ncb_num; PUCHAR ncb_buffer; WORD ncb_length; UCHAR ncb_callname[NCBNAMSZ]; UCHAR ncb_name[NCBNAMSZ]; UCHAR ncb_rto; UCHAR ncb_sto; void (*ncb_post) (struct _NCB *); UCHAR ncb_lana_num; UCHAR ncb_cmd_cplt; UCHAR ncb_reserve[10]; HANDLE ncb_event; } NCB; Объявим её у себя в программе. Так как на основе этой структуры производится общение с интерфейсом NetBios. NCB ncb; Дальше под эту структуру нам надо выделить память: memset( &ncb, 0, sizeof(ncb) ); А вот теперь поместим в структуру команду NCBRESET. Эта команда очищает имена и сеансы связи. Заканчивает невыполненные команды. Теперь в структуре нужно определить адаптерный номер LAN. Мы поставим 0. ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = 0; Результат выполнения команды возвращается в переменную, которую нужно объявить. UCHAR uRetCode; После подготовки данных и переменных можно выполнить команду NetBios uRetCode = Netbios((NCB*) &ncb ); Код возврата должен быть 0 при нормальном выполнении команды. Его мы и проверим. if ( uRetCode != 0 ) { cout << "error NCBRESET " << endl; exit(1); } Для получения адреса используется команда NCBASTAT с параметром - "*". Только перед заполнением блока лучше его обнулить. ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = 0; _mbscpy( ncb.ncb_callname,(UCHAR*)"* "); Подотовим структуру под информацию: typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }Adapter; Скажем, что буфер это структура адаптера и укажем длину: Adapter a1; ncb.ncb_buffer = (unsigned char *) &a1; ncb.ncb_length = sizeof(a1); Так как всё готово можно вызвать команду: uRetCode = Netbios((NCB*) &ncb ); И теперь, если все нормально, то есть код возврата и можно посмотреть адрес адаптера: if ( uRetCode == 0 ) { printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n", a1.adapt.adapter_address[0], a1.adapt.adapter_address[1], a1.adapt.adapter_address[2], a1.adapt.adapter_address[3], a1.adapt.adapter_address[4], a1.adapt.adapter_address[5] ); } Вот результат работы: Как видите он полностью совпадает с результатами работы NT. Полный код программы загрузите из проекта. А выводы такие. Работа с NetBios производится заполнением структур NCB с указанием команды и параметров. Вызывается функция NetBios, если возвращается результат, то в буфер. При удачном выпонениии код возврата 0. Работает это под NT под Windows 95, проверял. Загрузить проект | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|