Локальные сети персональных компьютеров. Работа с сервером Novell NetWare© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 168 стр. 7.5. Прием сообщенийДля приема сообщений предназначена функция GetBroadcastMessage(): int GetBroadcastMessage(char *MessageBuffer); Параметр определяет адрес буфера, в который будет записано принятое сообщение. Размер буфера должен составлять не менее 56 байт. Функция возвращает 0 при успешном завершении или код ошибки:
Если в буфере нет сообщений, в первый байт буфера будет записано нулевое значение. Вместо функции GetBroadcastMessage() можно использовать функцию E1h прерывания INT 21h:
Буфер запроса:
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);
}
|

