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