Первое, что я хочу сказать по поводу этой темы. Я в ней совершенно не разбираюсь. То есть я делаю у себя сеть на предприятии на базе 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, проверял.