Шрифт:
Можно видеть, что присвоением идентификатору узла (nd) нулевого значения мы сообщаем ядру о том, что мы желаем установить соединение на локальном узле.
С этого момента у меня есть идентификатор соединения — небольшое целое число, которое однозначно идентифицирует соединение моего клиента с конкретным сервером по заданному каналу.
Я смогу применять этот идентификатор для отправки запросов серверу сколько угодно раз. Выполнив все, для чего предназначалось соединение, я смогу уничтожить его с помощью функции:
Итак, давайте рассмотрим, как я воспользуюсь этим на практике.
Передача сообщения со стороны клиента осуществляется применением какой-либо функции из семейства MsgSend*.
Мы рассмотрим это на примере простейшей из них — MsgSend:
Аргументами функции MsgSend являются :
• идентификатор соединения с целевым сервером (coid);
• указатель на передаваемое сообщение (smsg);
• размер передаваемого сообщения (sbytes);
• указатель на буфер для ответного сообщения (rmsg);
• размер ответного сообщения (rbytes);
Что может быть проще!
Передадим сообщение процессу с идентификатором 77 по каналу 1:
Предположим, что процесс с идентификатором 77 был действительно активным сервером, ожидающим сообщение именно такого формата по каналу с идентификатором 1. После приема сообщения сервер обрабатывает его и в некоторый момент времени выдает ответ с результатами обработки. В этот момент функция MsgSend должна возвратить ноль (0), указывая этим, что все прошло успешно. Если бы сервер послал нам в ответ какие-то данные, мы смогли бы вывести их на экран с помощью последней строки в программе (с тем предположением, что обратно мы получаем корректную ASCIIZ-строку).
Сервер
Теперь, когда мы рассмотрели клиента, перейдем к серверу. Клиент использовал функцию ConnectAttach для создания соединения с сервером, а затем использовал функцию MsgSend для передачи сообщений.
Под этим подразумевается, что сервер должен создать канал — то, к чему присоединялся клиент, когда вызывал функцию ConnectAttach. Обычно сервер, однажды создав канал, приберегает его «впрок».
Канал создается с помощью функции ChannelCreate и уничтожается с помощью функции ChannelDestroy:
Мы еще вернемся к обсуждению аргумента flags (в разделе «Флаги каналов», см. ниже), а покамест будем использовать для него значение 0 (ноль). Таким образом, для создания канала сервер должен сделать так: