Протокол NETBIOS. Изучение и программирование командного интерфейса протокола NETBIOS, страница 2

            cur.listen_ncb.NCB_STO = sto;

            netbios(&cur.listen_ncb);

            return cur.listen_ncb.NCB_RETCODE;

}

Функция вызова, используется режим без ожидания:

byte call(COMM &cur, char *who, char *us, void interrupt (*post_function)(__CPPARGS), byte rto, byte sto)

{

            char who_name[16], us_name[16];

            real_name(who_name, who);

            real_name(us_name, us);

            memset (&cur.call_ncb,0,sizeof(NCB));

            cur.call_ncb.NCB_COMMAND = CALL;

            strcpy(cur.call_ncb.NCB_NAME, us_name);

            strcpy(cur.call_ncb.NCB_CALLNAME, who_name);

            cur.call_ncb.POST_FUNC = post_function;

            cur.call_ncb.NCB_RTO = rto;

            cur.call_ncb.NCB_STO = sto;

            netbios(&cur.call_ncb);

            return cur.call_ncb.NCB_RETCODE;

}

6.  Передача сообщений

Функция передачи сообщения конкретному абоненту, в режиме с ожиданием:

byte send(COMM &cur, byte lsn,void far *packet_ptr,int packet_len)

{

            memset (&cur.send_ncb,0,sizeof(NCB));

            cur.send_ncb.NCB_COMMAND = SEND_WAIT;

            cur.send_ncb.NCB_LSN = lsn;

            cur.send_ncb.NCB_LENGTH = packet_len;

            cur.send_ncb.NCB_BUFFER_PTR = packet_ptr;

            netbios(&cur.send_ncb);

            return cur.send_ncb.NCB_CMD_CPLT;

}

Функция ожидания получения сообщения от любого из абонентов, в режиме без ожидания:

byte receive_any(COMM &cur,void interrupt (*post_function)(__CPPARGS),

                             void *packet_ptr, int packet_len)

{

            memset (&cur.receive_any_ncb,0,sizeof(NCB));

            cur.receive_any_ncb.NCB_COMMAND = RECEIVE_ANY;

            cur.receive_any_ncb.POST_FUNC = post_function;

            cur.receive_any_ncb.NCB_NUM = cur.num;

            cur.receive_any_ncb.NCB_LENGTH = packet_len;

            cur.receive_any_ncb.NCB_BUFFER_PTR = packet_ptr;

            netbios(&cur.receive_any_ncb);

            return cur.receive_any_ncb.NCB_RETCODE;

}

7.  Определение статуса сессии

Функция получения состояния сессий для заданного имени, в режиме с ожиданием:

byte name_status(COMM &cur, char *name, STATUS_INFO *status)

{

            memset(&cur.session_status_ncb,0,sizeof(NCB));

            cur.session_status_ncb.NCB_COMMAND = SESSION_STATUS_WAIT;

            real_name(cur.session_status_ncb.NCB_NAME,name);

            cur.session_status_ncb.NCB_LENGTH = sizeof(STATUS_INFO);

            cur.session_status_ncb.NCB_BUFFER_PTR = status;

            netbios(&cur.session_status_ncb);

            return cur.session_status_ncb.NCB_CMD_CPLT;

}

В результате выполнения функции заполняется структура, содержащая следующею информацию:

·  номер сессии;

·  текущее состояние сессии (таблица 1);

·  имя локального партнера сессии;

·  имя удаленного партнера сессии;

·  количество незавершенных команд Receive;

·  количество незавершенных команд Send и Chain Send;

                                                                                              Таблица 1

Статус

Значение

1

Выполняется команда Listen

2

Выполняется команда Call

3

Сессия установлена

4

Выполняется команда Hang Up

5

Выполняется команда Hahg Up

8.  Завершение сессии

Функция завершения сессии, используется в режиме с ожиданием:

byte hangup(COMM &cur, byte lsn)

{

            memset(&cur.hangup_ncb,0,sizeof(NCB));

            cur.hangup_ncb.NCB_COMMAND = HANG_UP_WAIT;

            cur.hangup_ncb.NCB_LSN = lsn;

            netbios(&cur.hangup_ncb);

            return cur.hangup_ncb.NCB_CMD_CPLT;

}

Для снятия активного блока управления (NCB) необходимо вызвать функцию cancel, иначе будет невозможно удаления имени из таблицы имен.

Функция снятия блока, имеет только режим без ожидания:

byte cancel(COMM &cur, void interrupt (*post_function)(__CPPARGS), NCB *np)

{

            memset (&cur.cancel_ncb,0,sizeof(NCB));

            cur.cancel_ncb.NCB_COMMAND = CANCEL;

            cur.cancel_ncb.NCB_BUFFER_PTR = np;

            cur.cancel_ncb.POST_FUNC = post_function;

            netbios(&cur.cancel_ncb);

            return cur.cancel_ncb.NCB_RETCODE;

}

9.  Сброс адаптера

Команда NetBios Reset Adapter выполняет следующее:

·  удаление всех имен из локальной таблицы имен (кроме постоянного имени узла),

·  разрушение всех активных сессий,

·  отмена незавершенных NCB.

Если задано ненулевое значение поля NCB_LSN, то это значение будет использовано как новое значение максимального количества сессий. Нулевое значение указывает NetBios на использование значения по умолчанию обычно 6). Если задано ненулевое значение поля NCB_NUM, NetBios использует это значение как новое максимальное количество одновременно используемых блоков NCB. Если это поле равно нулю, то NetBios использует значение по умолчанию, которое обычно равно 12.

Функция сброса адаптера, не имеет режима с ожиданием:

byte reset(COMM &cur)

{

            if(cur.reset_ncb.NCB_CMD_CPLT == 0xFF) return -1;

            memset (&cur.reset_ncb,0,sizeof(NCB));

            cur.reset_ncb.NCB_COMMAND = RESET;

            netbios(&cur.reset_ncb);

            return cur.reset_ncb.NCB_RETCODE;

}

Все данные функции используются в лабораторных работах №7 и №8, в следствие чего содержат в качестве передаваемого параметра структуру COMM, являющуюся коммуникатором. Данная структура будет подробнее описана в дальнейшем.