Шаг 6 - Получение имен NetBIOS

В этом шаге мы получим все имена связанные с конкретным числом LANA.

Первое, что мы сделаем это объявим константы:

#define LANANUM 000	// Адрес LANA
#define LOCALNAME "MYNET"	// Моё имя
#define MAX_SESSION 20	// Максимальное количество имен
#define MAX_NAMES 30

Инициализируем NetBios по конкретному LANA используя команду NCBRESET:

NCB ncb;
UCHAR uRetCode; 
memset (&ncb, 0, sizeof (ncb));
//---------- Установка параметров
ncb.ncb_command = NCBRESET;
ncb.ncb_lsn = 0;                
ncb.ncb_lana_num = LANANUM;
ncb.ncb_callname[0] = MAX_SESSION;  
ncb.ncb_callname[2] = MAX_NAMES;  
//-------------- Вызов и проверка
uRetCode = Netbios((NCB*) &ncb );
if ( uRetCode != 0 )  
{
	cout << "error NCBRESET " << endl;
	exit(1);
}

Следующим шагом надо добавить имя, только для начала его нужно сформировать учитывая правила NetBios. Сформированное имя необходимо поместить в переменную ncb_name структуры NCB:

int i_strlen;
NCB ncb1;
memset(&ncb1, 0, sizeof (ncb1));
//---------------Создаем имя ----------------------
i_strlen = strlen(LOCALNAME);
if (i_strlen > NCBNAMSZ)    i_strlen = NCBNAMSZ;
memset (ncb1.ncb_name, ' ', NCBNAMSZ);
memcpy (ncb1.ncb_name, LOCALNAME, i_strlen);
//--------- NetBios пораметры и запуск -------
ncb1.ncb_command = NCBADDNAME;
ncb1.ncb_lana_num = LANANUM;
uRetCode = Netbios((NCB*) &ncb1 );
if ( uRetCode != 0 )  
{
	cout << "error NCBADDNAME " << endl;
	exit(1);
}

Теперь мы можем воспользоваться командой NCBASTAT для получения информации в массив ADAPTER_STATUS откуда извлекаем их используя массив NAME_BUFFER. В ncb_callname необходимо имя дистанционного приложения. Мы его сначала добавили, а потом использовали для получения статуса адаптера.

NCB ncb2;
ADAPTER_STATUS *pStatus;
memset (&ncb2, 0, sizeof (ncb2));
HANDLE hHeap;
int cbBuffer;
hHeap = GetProcessHeap();
cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER);
pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer);
//---------------
memset (ncb2.ncb_callname, ' ', NCBNAMSZ);
memcpy (ncb2.ncb_callname, LOCALNAME, i_strlen);
//---------------
ncb2.ncb_command = NCBASTAT;
ncb2.ncb_lana_num = LANANUM;
ncb2.ncb_buffer = (PUCHAR) pStatus;
ncb2.ncb_length = cbBuffer;
uRetCode = Netbios((NCB*) &ncb2 );
if ( uRetCode != 0 )  
{
	cout << "error NCBASTAT " << endl;
	exit(1);
}
// ---- Все нормально
NAME_BUFFER *pNames;
pNames = (NAME_BUFFER *) (pStatus + 1);
for (int i = 0; i < pStatus->name_count; i++)
	printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name);

В результате работы программы на экране должно быть что-то типа этого, как ниже:

gif/6_1.gif (3155 b)

Если Вы не сможете сами, то загрузите проект. Мне пришлось всё это скомкать вместе из-за того, что nbstat я почему-то не нашел, но в следуюших шагах я постараюсь разделить этот проект на более понятные части.


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