Шаг 1 - Получение MAC адреса сетевой карты

Первое, что я хочу сказать по поводу этой темы. Я в ней совершенно не разбираюсь. То есть я делаю у себя сеть на предприятии на базе NT Server и она работает :-). Так же я считаю, что лучше понять как работает программное обеспечение можно только научившись программировать :-) все это обеспечение. Так что особенно не наезжайте :-). Это и мой первый шаг :-). Приму с большой благодарностью любую Вашу помошь и советы. Литературы по этому поводу не очень много. Давайте вместе. А ?

MAC - Media Access Control это номер сетевой карты. Он зашивается в карту производителем и используется протоколами сети. Если у Вас NT, то Вы можете его увидеть вот как. Administrative tools -> Windows NT Diagnostic далее вкладка Network и кнопка Transport. Для решения этой задачи мы будем использовать функции Netbios. Вобщем мы попробуем, а потом я напишу поподробнее о NetBios.

gif/1_1.gif (6260 b)

Создаем приложение 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]
	);
}

Вот результат работы:

gif/1_2.gif (2003 b)

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

Полный код программы загрузите из проекта. А выводы такие. Работа с NetBios производится заполнением структур NCB с указанием команды и параметров. Вызывается функция NetBios, если возвращается результат, то в буфер. При удачном выпонениии код возврата 0.

Работает это под NT под Windows 95, проверял.


Загрузить проект | Следующий Шаг | Оглавление
Автор Каев Артем - 08.01.2000