Помимо файла заголовков компилятор
Заглушка сервера является головной программой, обрабатывающей все сетевое взаимодействие с клиентом (точнее, с его заглушкой). Для выполнения операции заглушка сервера производит локальный вызов функции, текст которой необходимо написать:
#include
#include
#include
#include "log.h"
int* rlog_1(char** arg) {
/* Возвращаемое значение должно определяться как static */
static int result;
int fd; /* Файловый дескриптор журнала */
int len;
result = 1;
/* Откроем файл журнала (создадим, если он не существует),
в случае неудачи вернем код ошибки result == 1. */
if ((fd = open("./server.log",
O_CREAT | O_RDWR | O_APPEND)) < 0)
return(&result);
len = strlen(*arg);
if (write(fd, arg, strlen(arg) != len)
result = 1;
else
result = 0;
close(fd);
return(&result); /* Возвращаем результат — адрес result */
}
Заглушка клиента принимает аргумент, передаваемый удаленной процедуре, делает необходимые преобразования, формирует запрос на сервер
#include
#include "log.h"
main(int argc, char* argv[]) {
CLIENT *cl;
char *server, *mystring, *clnttime;
time_t bintime;
int* result;
if (argc != 2) {
fprintf(stderr, "Формат вызова: %s Адрес_хоста\n", argv[0]);
exit(1);
}
server = argv[1];
/* Получим дескриптор клиента. В случае неудачи — сообщим
о невозможности установления связи с сервером */
if ((cl =
clnt_create(server, LOG_PROG, LOG_VER, "udp")) == NULL) {
clnt_pcreateerror(server);
exit(2);
}
/* Выделим буфер для строки */
mystring = (char*)malloc(100);
/* Определим время события */
bintime = time((time_t*)NULL);
clnttime = ctime(&bintime);
sprintf(mystring, "%s - Клиент запущен", clntime);
/* Передадим сообщение для журнала — время начала
работы клиента. В случае неудачи — сообщим об ошибке */
if ((result = rlog_1(&mystring, cl)) == NULL) {
fprintf(stderr, "error2\n");
clnt_perror(cl, server);
exit(3);
}
/* В случае неудачи на удаленном компьютере сообщим об ошибке */
if (*result != 0)
fprintf(stderr, "Ошибка записи в журнал\n");
/* Освободим дескриптор */
clnt_destroy(cl);
exit(0);
}
Заглушка клиента log_clnt.с компилируется с модулем client.с для получения исполняемой программы клиента.
cc -o rlog client.c log_clnt.c -lns1
Заглушка сервера log_svc.с и процедура log.c компилируются для получения исполняемой программы сервера.
cc -o logger log_svc.c log.c -lns1
Теперь на некотором хосте server.nowhere.ru необходимо запустить серверный процесс:
$ logger
После чего при запуске клиента
Схема работы RPC в этом случае приведена на рис. 6.20. Модули взаимодействуют следующим образом:
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии