Лабораторная работа N 6.
Протокол NETBIOS.
Цель работы: Изучение и программирование командного интерфейса протокола NETBIOS.
Исходные данные:
Выполнение работы:
Работа выполнялась в операционной системе Windows 2000, в следствие чего был использован не эмулятор NetBios для сетей NetWare (IPX), прилагаемый к заданию, а используемый в Windows протокол NetBios over TCP/IP в эмуляции для DOS приложений.
Большинство команд NETBIOS могут быть выполнены как в режиме ожидания, так и без ожидания.
Когда используется команда с ожиданием, NETBIOS завершает операцию прежде, чем вернется в прикладную программу. Использование команд с ожиданием может быть рискованным, так как при возникновении ошибочной ситуации (ошибка оборудования или отключение питания на другой рабочей станции) прикладная программа может ждать ответа, который никогда не придет.
Если используется команда без ожидания, после ее вызова прикладная программа либо находится в состоянии опроса окончания выполнения команды, либо передает NETBIOS адрес одной из своих процедур, так называемой POST-процедуры. NETBIOS вызывает POST-процедуру после окончания выполнения команды. Когда используется режим без ожидания, прикладная программа должна проверять два возвращаемых кода, чтобы определить, успешно ли окончилась операция: первый - это немедленно возвращаемый код, получаемый сразу после возврата управления в прикладную программу. Второй - окончательный код возврата, который NETBIOS устанавливает по завершению выполнения операции (пока операция не завершилась, его значение равно 0xFF).
Программирование основных команд NETBIOS:
1. Структура блока управления (NCB)
typedef struct
{
byte NCB_COMMAND; //команда
byte NCB_RETCODE; //немедленно возвращаемый код
byte NCB_LSN; //номер локальной сессии
byte NCB_NUM; //номер имени
void far *NCB_BUFFER_PTR; //указатель на буфер данных
word NCB_LENGTH; //длина буфера данных
byte NCB_CALLNAME[16]; //имя удаленной станции
byte NCB_NAME[16]; //имя местной рабочей станции
byte NCB_RTO; // тайм-аут получения
byte NCB_STO; // тайм-аут передачи
void interrupt (*PST_FUNC)(__CPPARGS); // адрес POST-процедуры
byte NCB_LANA_NUM; // номер адаптера
byte NCB_CMD_CPLT; // окончательно возвращаемый код
byte NCB_RESERVER[14]; // зарезервировано
} NCB;
2. Тест установки NetBios
void check_netbios()
{
NCB test_ncb;
void interrupt (*int_5C_vector)(__CPPARGS);
int_5C_vector = getvect(0x5C);
if(int_5C_vector == (void far *)NULL) {
printf("NetBIOS не загружен, не установлено int5C.\n");
exit(1);
}
memset(&test_ncb,0,sizeof(NCB));
test_ncb.NCB_COMMAND = 0x7F;
netbios(&test_ncb);
if (test_ncb.NCB_RETCODE != 0x03) {
printf("NetBIOS не загружен, неверная реакция на int5C.\n");
exit(1);
}
printf("NetBios обнаружен.\n");
}
3. Добавление имен
Каждое имя, добавляемое в локальную таблицу имен, должно быть проверено на то, чтобы имя представляло собой нормальную строку на С, которой можно легко манипулировать в программе, а также, чтобы оно было подходящей записью в таблице имен. Имя должно быть длиной 15 байтов с нулевым байтом после последнего значащего символа.
Данная функция преобразует имя в соответствии с принятыми соглашениями:
void real_name(char *dest_name, char *src_name)
{
strncpy(dest_name, src_name, 15);
while (strlen(dest_name) < 15)
strcat(dest_name," ");
}
Функция добавления нового имени в локальную таблицу имен, используется режим с ожиданием:
byte add_name(COMM &cur, char *name)
{
char netbios_name[16];
real_name(netbios_name, name);
memset(&cur.add_name_ncb,0,sizeof(NCB));
cur.add_name_ncb.NCB_COMMAND = ADD_NAME_WAIT;
strcpy(cur.add_name_ncb.NCB_NAME, netbios_name);
netbios(&cur.add_name_ncb);
return cur.add_name_ncb.NCB_CMD_CPLT;
}
4. Удаление имени
Функция удаления имени из локальной таблицы имен, используется режим с ожиданием:
byte delete_name(COMM &cur, char *name)
{
char netbios_name[16];
real_name(netbios_name, name);
memset(&cur.delete_name_ncb,0,sizeof(NCB));
cur.delete_name_ncb.NCB_COMMAND = DELETE_NAME_WAIT;
strcpy(cur.delete_name_ncb.NCB_NAME, netbios_name);
netbios(&cur.delete_name_ncb);
return cur.delete_name_ncb.NCB_CMD_CPLT;
}
5. Установка сессий
Функция ожидания вызова, используется режим без ожидания:
byte listen(COMM &cur, char *caller, char *us, void interrupt (*post_function)(__CPPARGS), byte rto, byte sto)
{
char caller_name[16], us_name[16];
real_name(caller_name, caller);
real_name(us_name, us);
memset (&cur.listen_ncb,0,sizeof(NCB));
cur.listen_ncb.NCB_COMMAND = LISTEN;
strcpy(cur.listen_ncb.NCB_NAME, us_name);
strcpy(cur.listen_ncb.NCB_CALLNAME, caller_name);
cur.listen_ncb.POST_FUNC = post_function;
cur.listen_ncb.NCB_RTO = rto;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.