Итак, рассмотрим теперь функции по порядку. Первое, что мы должны сделать — это установить соединение. Это мы сделаем с помощью функции
#include
int ConnectAttach(int nd, pid_t pid, int chid,
unsigned index, int flags);
Функции
Вместе эти три идентификатора, которые обычно записываются в виде «ND/PID/CHID», однозначно идентифицируют сервер, с которым клиент желает соединиться. Аргументы
Итак, предположим, что мы хотим подсоединиться к процессу, находящемуся на нашем узле и имеющего идентификатор 77, по каналу с идентификатором 1. Ниже приведен пример программы для выполнения этого:
int coid;
coid = ConnectAttach(0, 77, 1, 0, 0);
Можно видеть, что присвоением идентификатору узла (
С этого момента у меня есть идентификатор соединения — небольшое целое число, которое однозначно идентифицирует соединение моего клиента с конкретным сервером по заданному каналу.
Я смогу применять этот идентификатор для отправки запросов серверу сколько угодно раз. Выполнив все, для чего предназначалось соединение, я смогу уничтожить его с помощью функции:
ConnectDetach(coid);
Итак, давайте рассмотрим, как я воспользуюсь этим на практике.
Передача сообщения со стороны клиента осуществляется применением какой-либо функции из семейства
Мы рассмотрим это на примере простейшей из них —
#include
int MsgSend(int coid, const void *smsg, int sbytes,
void *rmsg, int rbytes);
Аргументами функции
• идентификатор соединения с целевым сервером (
• указатель на передаваемое сообщение (
• размер передаваемого сообщения (
• указатель на буфер для ответного сообщения (
• размер ответного сообщения (
Что может быть проще!
Передадим сообщение процессу с идентификатором 77 по каналу 1:
#include
char *smsg = "Это буфер вывода";
char rmsg[200];
int coid;
// Установить соединение
coid = ConnectAttach(0, 77, 1, 0, 0);
if (coid == -1) {
fprintf(stderr, "Ошибка ConnectAttach к 0/77/1!\n");
perror(NULL);
exit(EXIT_FAILURE);
}
// Послать сообщение
if (MsgSend(
coid, smsg, strlen(smsg) + 1, rmsg, sizeof(rmsg)) == -1) {
fprintf (stderr, "Ошибка MsgSend\n");
perror(NULL);
exit (EXIT_FAILURE);
}
if (strlen(rmsg) > 0) {
printf("Процесс с ID 77 возвратил \"%s\"\n", rmsg);
}
Предположим, что процесс с идентификатором 77 был действительно активным сервером, ожидающим сообщение именно такого формата по каналу с идентификатором 1. После приема сообщения сервер обрабатывает его и в некоторый момент времени выдает ответ с результатами обработки. В этот момент функция
Сервер
Теперь, когда мы рассмотрели клиента, перейдем к серверу. Клиент использовал функцию
Под этим подразумевается, что сервер должен создать канал — то, к чему присоединялся клиент, когда вызывал функцию
Канал создается с помощью функции
#include
int ChannelCreate(unsigned flags);
int ChannelDestroy(int chid);