
- •Введение
- •Основные теоретические положения
- •1. Адресация станций и программ
- •2. Работа с протоколом netbios
- •2.1. Проверка присутствия netbios
- •2.2. Вызов команд протокола netbios
- •2.3. Формат блока ncb
- •2.4. Post-программа
- •3. Команды netbios
- •3.1. Работа №1
- •3.1.1. Работа с именами
- •3.1.2. Индивидуальные задания на работу
- •3.2. Работа №2
- •3.2.1. Прием и передача датаграмм
- •3.2.2. Система "клиент-сервер" на базе датаграмм
- •3.2.3. Индивидуальные задания на работу
- •3.3. Работа №3
- •3.3.1. Работа с каналами
- •3.3.2. Прием и передача данных через каналы
- •3.2.3. Система "клиент-сервер" на базе каналов
- •3.2.4. Индивидуальные задания на работу
- •4. Другие команды
- •5. Коды ошибок
- •6. Перечень использованной литературы
- •Функции netbios
3.2.3. Индивидуальные задания на работу
3.2.3.1. Индивидуальное задание для каждого студента. Определить индивидуальные и групповые сетевые имена NETBIOS из лабораторной работы №1 для программ "Клиент" и "Сервер", одна из которых будет запускаться на другой рабочей станции. Номер другой рабочей станции равен «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8») из NCB-блока полученного пакета.
3.2.3.2. Индивидуальное задание для каждого студента. Организовать работу системы «клиент-сервер» с опросом содержимого поля CCode для подготовленных в лабораторной работе №1 индивидуальных для каждого студента пересылаемых пакетов и NСВ-блоков. Одна из программ «клиент» или «сервер» размещается на рабочей станции с номером «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8»). Клиент первоначально обращается к серверу по известному из лабораторной работы №1 индивидуальному для каждого студента имени. Сервер использует для ответа NСВ-блок, полученный модификацией NСВ-блока для приема.
3.2.3.3. Индивидуальное задание для каждого студента. Модифицировать работу системы «клиент-сервер» из п. 3.2.3.2., объединив и клиента и сервера в одной программе. Произвести запуск системы на: а)двух разных рабочих станциях - № и «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8»); б)одной рабочей станции в мультизадачном режиме для двух экземпляров программы; в)одной рабочей станции с обращением программы через сеть самой к себе.
3.2.3.4. Индивидуальное задание для каждого студента. Организовать работу системы «клиент-сервер» с использованием подготовленной в лабораторной работе №1 POST-программы для подготовленных в лабораторной работе №1 индивидуальных для каждого студента пересылаемых пакетов и NСВ-блоков. Одна из программ «клиент» или «сервер» размещается на рабочей станции с номером «№-1», где «№» - номер собственной рабочей станции (при «№-1», равном нулю, номер другой станции принимается равным «8»). Клиент первоначально обращается к серверу по известному из лабораторной работы №1 индивидуальному для каждого студента имени. Сервер использует для ответа NСВ-блок, отличный от NСВ-блока для приема.
3.2.3.5. Общее задание для всех студентов. По результатам лабораторной работы подготовить полный протокол, включающий формулировку пунктов задания, краткое описание реализации каждого из пунктов задания с фрагментами кода, выводы по каждому из пунктов задания.
3.3. Работа №3
Бюджет времени на работу: два лабораторных занятия по два академических часа каждое. На первом лабораторном занятии изучается и защищается теоретический материал, подготавливаются фрагменты исходного кода, на втором лабораторном занятии выполняется отладка и компиляция объектных и исполняемых модулей, демонстрируется работа подготовленной программы.
3.3.1. Работа с каналами
В группе команд, предназначенных для работы с каналами, есть команды для создания канала, команды для удаления канала, а также команда для определения состояния канала.
Канал создается одновременно двумя станциями, одна из которых при этом находится в режиме приема запроса на создание канала, а другая передает такой запрос.
Возможно создать канал между любыми двумя именами в сети. При работе с каналами имена используются только для создания каналов. Впоследствии, когда каналы уже будут созданы, для передачи данных используются номера каналов, а не имена или номера имен.
Можно создать канал с самим собой, если при создании канала указать в качестве имени партнера свое имя.
NB_WCall (0х10)
Команда устанавливает канал между двумя именами, заданными в блоке NCB. Эти имена могут относиться к программам, работающим на разных станциях или на одной станции. В поле OurName указывается имя станции, которая устанавливает канал, в поле CallName - имя станции, с которой устанавливается канал.
Для успешного создания канала принимающая сторона должна выдать команду NB_Listen, которая будет описана ниже.
Можно установить канал не только с обычным, но и с групповым именем. Для этого придется выдать команду NB_WCall несколько раз, так как за один вызов создается только один канал.
Команда NB_WCall делает несколько попыток создать канал и в случае неудачи возвращает код ошибки.
При создании канала указывается время тайм-аута для операций приема и передачи данных. Если команды приема или передачи данных через каналы не будут выполнены в течение времени тайм-аута, они (команды) будут прерваны. При этом считается, что канал неработоспособен.
После создания канала поле LocalSessionNumber будет содержать присвоенный номер канала. Сохраните его для использования в процессе приема и передачи данных по каналу.
Поля NCB на входе Содержимое
Cmd 0х10
CallName Имя, с которым устанавливается канал
OurName Имя станции, создающей канал
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
Ccode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля Ccode Значение
на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х09 Нет доступных ресурсов
0х15 Неправильное имя
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбои сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля Значение
FinalCCode на выходе
0х00 Нет ошибок
0х03 Неправильньш код команды
0х05 Истекло время ожидания
0х09 Нет доступных ресурсов
0х0В Команда отменена
0х11 Переполнилась таблица каналов
0х12 Создание канала отвергнуто
0х14 Нет ответа от станции с указанным именем или в сети нет такого имени
0х15 Неправильное имя
0х18 Ненормальное закрытое канала
0х19 Конфликт имен (внутренняя ошибка NETBIOS)
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
NB_Call (0х90)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0х90.
NB_WListen (0х11)
Команда работает в паре с предыдущей командой и предназначена для организации канала с вызываемой стороны.
В поле CallName блока NCB необходимо указать имя, с которым устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вызывающей станцией.
Программа может выдать несколько команд NB_Listen для создания одновременно нескольких каналов.
В случае успешного завершения команда запишет в поле LocalSessionNumber номер созданного канала.
При создании канала необходимо указать время тайм-аута для операций приема и передачи данных через канал. Сама команда NB_WListen не использует тайм-аут. Программа, выдавшая эту команду, будет находиться в состоянии ожидания до тех пор, пока какая-либо станция не пожелает создать с ней канал. Для исключения состояния "зависания" программы лучше использовать вариант NB_Listen этой команды (без ожидания).
Поля NCB на входе Содержимое
Cmd 0х11
CallName Имя, с которьм устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вьвывающей станцией
OurName Имя станции, создающей канал с принимающей стороны
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля НСВ на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
CallName В это поле записывается имя вызвавшей станции, если при установлении канала было указано имя "*"
Ccode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля Ccode Значение
на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х09 Нет доступных ресурсов
0х15 Неправильное имя
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля Значение
FinalCCode на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х09 Нет доступных ресурсов
0х0В Команда отменена
0х11 Переполнилась таблица каналов
0х15 Неправильное имя
0х17 Указанное имя было удалено
0х18 Ненормальное закрытие канала
0х19 Конфликт имен (внутренняя ошибка NETBIOS)
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
NB_Listen (0х91)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0х91.
NB_WHangUp (0х12)
Команда предназначена для закрытия канала, номер которого указан в поле LocalSessionNumber блока NCB. Она должна быть выполнена с обеих сторон канала после завершения работы.
Если для закрываемого с помощью этой команды канала на других станциях выдана команда NB_WReceive, она завершается с кодом ошибки 0х0А. Выданная для закрываемого канала команда NB_WSend также завершается с кодом 0х0А, но через 20 секунд, которые отводятся ей для завершения своей работы. Если команда NB_WSend не успела завершить передачу за 20 секунд, команда NB_WHangUp завершается с кодом 0х05.
Аналогично с кодом 0х0А завершает свою работу и команда NB_WReceiveAny, выданная для закрываемого канала.
Другие команды, выданные для закрываемого канала, завершаются с кодом 0х18. Если программа пытается закрыть канал, который был уже закрыт или не существовал, такая ситуация не считается ошибочной и в поле кода ошибки проставляется нулевое значение.
Поля NCB на входе Содержимое
Cmd 0х12
LocalSessionNumber Номер закрываемого канала
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
Ccode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля Ccode Значение
на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля Значение
FinalCCode на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х05 Истекло время ожидания
0х08 Неправильный номер канала
0х0А Канал уже закрыт
0х0В Команда отменена
0х18 Ненормальное закрытие канала
0х19 Конфликт имен (внутренняя ошибка NETBIOS)
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбои сетевого адаптера или другого сетевого аппаратного обеспечения
NB_HangUp (0х92)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0х92.
NB_WSessionStatus (0х34)
Команда возвращает программе состояние канала, имя которого указано в поле OurName блока NCB. В качестве имени можно указать символ "*", в этом случае программа получит информацию о каналах, относящихся ко всем именам станций, имеющихся в локальной таблице имен на вызывающей команду станции.
Информация о состоянии каналов возвращается в буфер, адрес которого программа должна записать в поле Buffer блока NCB. Размер буфера должен быть указан в поле Size блока NCB.
Формат буфера можно описать следующей структурой:
struct _SESSION_STATUS {
unsigned char NameNumber;
unsigned char SessionCount;
unsigned char DatagramsOutstanding;
unsigned char ReceiveAnyoutstanding;
struct _SESSION {
unsigned char LocalSessionNumber;
unsigned char State;
char LocalName[16];
char RemoteName[16];
unsigned char ReceiveCount;
unsigned char SendCount;
} Session[40];
};
Приведем список полей буфера:
Название поля Назначение поля
NameNumber Номер имени канала
SessionCount Количество каналов
DatagramsOutstanding Количество выданных команд на прием датаграмм
ReceiveAnyoutstanding Количество выданных команд на прием командой
NB_ReceiveAny Session Массив структур, описывающих каждый канал в отдельности
LocalSessionNumber Номер канала
State Состояние канала:
1 - ожидание завершения команды NB_Listen;
2 - ожидание завершения команды NB_Call;
3 - канал установлен;
4 - ожидание завершения команды NB_HangUp;
5 - команда NB_HangUp завершила свое выполнение;
6 - канал закрыт с ошибкой.
LocalName Имя локальной станции
RemoteName Имя удаленной станции
ReceiveCount Количество ожидающих завершения команд NB_Receive
SendCount Количество ожидающих завершения команд NB_Send
Поля NCB на входе Содержимое
Cmd 0х34
Buffer Дальний адрес буфера для приема информации о состоянии каналов
Size Размер буфера
OurNames Имя канала, для которого необходимо получить информацию о состоянии. В качестве имени можно
указывать "*"
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
Size Размер заполненной части буфера
Ccode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode Значение
на выходе
0х00 Нет ошибок
0х03 Неправильный код команды
0х15 Неправильное имя
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля Значение
FinalCCode на выходе
0х00 Нет ошибок
0х01 Неправильная длина буфера
0х03 Неправильный код команды
0х06 Слишком мал размер выделенного буфера
0х19 Конфликт имен (внутренняя ошибка NETOIOS)
0х21 Интерфейс занят
0х22 Выдано слишком много команд
0х23 Неправильное значение в поле номера адаптера AdapterNumber
0х40 - 0x4F Необычное состояние сети (Unusual network condition)
0х50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
NB_SessionStatus (0xB4)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB4.