Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 168 стр.

[Назад] [Содеожание] [Дальше]

7.5. Прием сообщений

Для приема сообщений предназначена функция GetBroadcastMessage():

int GetBroadcastMessage(char *MessageBuffer);


Параметр определяет адрес буфера, в который будет записано принятое сообщение. Размер буфера должен составлять не менее 56 байт.

Функция возвращает 0 при успешном завершении или код ошибки:

Код ошибки Значение
0xFC Переполнение очереди сообщений
0xFE Ошибка ввода/вывода или нехватка памяти на сервере

Если в буфере нет сообщений, в первый байт буфера будет записано нулевое значение.

Вместо функции GetBroadcastMessage() можно использовать функцию E1h прерывания INT 21h:

На входе: AH = E1h;
DS:SI = Адрес буфера запроса;
ES:DI = Адрес буфера ответа.
На выходе: AL = Код ошибки или 0, если операция завершилась без ошибок.

Буфер запроса:

struct REQUEST {
        WORD    PacketLength;        // размер пакета запроса
        BYTE    Function;            // должно быть равно 1
};


Буфер ответа:

struct REPLAY {
        WORD    PacketLength;        // размер пакета
        BYTE    MessageLength;       // длина сообщения
        BYTE    Message[MessageLength]; // сообщение
};


7.5.1. Программа MSGRCV

Программа MSGRCV (листинг 29) изменяет текущий режим приема сообщений, блокируя автоматическую выдачу сетевой оболочкой приходящих сообщений в нижней строке экрана. Программа сама принимает эти сообщения и сама выводит их в стандартный поток вывода.

Перед завершением работы восстанавливается старый режим приема сообщений.

// ===================================================
// Листинг 29. Прием сообщений
// Файл msgrcv\msgrcv.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#define WORD unsigned int
#define BYTE unsigned char

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int GetBroadcastMessage(char*);
extern "C" BYTE GetBroadcastMode(void);
extern "C" void SetBroadcastMode(BYTE);

void main(void) {

        char MajorVersion=0;
        char MinorVersion=0;
        char Revision=0;

        BYTE OldBroadcastMode;
        char MessageBuffer[56];
        int ccode;

        printf("\n*MSGRCV* (C) Frolov A., 1993\n");

// Проверяем присутствие сетевой оболочки

        asm push si
        GetNetWareShellVersion(&MajorVersion,
                        &MinorVersion, &Revision);
        asm pop si

        if(MajorVersion == 0) {
                printf("\nОболочка NetWare не загружена\n");
                return;
        }

// Сохраняем старый режим приема сообщений

        OldBroadcastMode = GetBroadcastMode();

// Устанавливаем режим, при котором сообщения от файл-сервера и поль-
// зователей записываются в буфер, но автоматически не отображаются

        SetBroadcastMode(3);

// Ожидаем прихода сообщения

        for(;;) {

// Извлекаем сообщение из буфера

                ccode = GetBroadcastMessage(MessageBuffer);
                if(ccode) break;

// Если сообщение есть в буфере, выводим его

                if(MessageBuffer[0] != '\0') {
                        printf(">>> %s\n", MessageBuffer);
                }

// Если оператор нажал на любую клавишу,
// завершаем работу программы

                if(kbhit()) break;
        }
// Восстанавливаем старый режим приема сообщений

        SetBroadcastMode(OldBroadcastMode);
}
[Назад] [Содеожание] [Дальше]