Клиент

Клиент

Клиент, который желает послать запрос серверу, блокируется до тех пор, пока сервер не завершит обработку запроса. Затем, после завершения сервером обработки запроса, клиент разблокируется, чтобы принять «ответ».

Это подразумевает обеспечение двух условий: клиент должен «уметь» сначала установить соединение с сервером, а потом обмениваться с ним данными с помощью сообщений — как в одну сторону (запрос — «send»), так и в другую (ответ — «reply»).

Установление соединения

Итак, рассмотрим теперь функции по порядку. Первое, что мы должны сделать — это установить соединение. Это мы сделаем с помощью функции ConnectAttach(), описанной следующим образом:

#include <sys/neutrino.h>

int ConnectAttach(int nd, pid_t pid, int chid,

 unsigned index, int flags);

Функции ConnectAttach() передаются три идентификатора: идентификатор nd — дескриптор узла (Node Descriptor), идентификатор pid — идентификатор процесса (process ID) и идентификатор chid — идентификатор канала (channel ID).

Вместе эти три идентификатора, которые обычно записываются в виде «ND/PID/CHID», однозначно идентифицируют сервер, с которым клиент желает соединиться. Аргументы index и flags мы здесь просто проигнорируем (установим их в ноль).

Итак, предположим, что мы хотим подсоединиться к процессу, находящемуся на нашем узле и имеющего идентификатор 77, по каналу с идентификатором 1. Ниже приведен пример программы для выполнения этого:

int coid;

coid = ConnectAttach(0, 77, 1, 0, 0);

Можно видеть, что присвоением идентификатору узла (nd) нулевого значения мы сообщаем ядру о том, что мы желаем установить соединение на локальном узле.

Как я узнал, что соединиться надо с процессом 77 и по каналу 1? К этому мы скоро вернемся (см. ниже «Поиск сервера по ND/PID/CHID»).

С этого момента у меня есть идентификатор соединения — небольшое целое число, которое однозначно идентифицирует соединение моего клиента с конкретным сервером по заданному каналу.

Я смогу применять этот идентификатор для отправки запросов серверу сколько угодно раз. Выполнив все, для чего предназначалось соединение, я смогу уничтожить его с помощью функции:

ConnectDetach(coid);

Итак, давайте рассмотрим, как я воспользуюсь этим на практике.

Передача сообщений (sending)

Передача сообщения со стороны клиента осуществляется применением какой-либо функции из семейства MsgSend*().

Мы рассмотрим это на примере простейшей из них — MsgSend():

#include <sys/neutrino.h>

int MsgSend(int coid, const void *smsg, int sbytes,

 void *rmsg, int rbytes);

Аргументами функции MsgSend() являются :

• идентификатор соединения с целевым сервером (coid);

• указатель на передаваемое сообщение (smsg);

• размер передаваемого сообщения (sbytes);

• указатель на буфер для ответного сообщения (rmsg);

• размер ответного сообщения (rbytes);

Что может быть проще!

Передадим сообщение процессу с идентификатором 77 по каналу 1:

#include <sys/neutrino.h>

char *smsg = "Это буфер вывода";

char rmsg[200];

int coid;

// Установить соединение

coid = ConnectAttach(0, 77, 1, 0, 0);

if (coid == -1) {

 fprintf(stderr, "Ошибка ConnectAttach к 0/77/1! ");

 perror(NULL);

 exit(EXIT_FAILURE);

}

// Послать сообщение

if (MsgSend(

 coid, smsg, strlen(smsg) + 1, rmsg, sizeof(rmsg)) == -1) {

 fprintf (stderr, "Ошибка MsgSend ");

 perror(NULL);

 exit (EXIT_FAILURE);

}

if (strlen(rmsg) > 0) {

 printf("Процесс с ID 77 возвратил "%s" ", rmsg);

}

Предположим, что процесс с идентификатором 77 был действительно активным сервером, ожидающим сообщение именно такого формата по каналу с идентификатором 1. После приема сообщения сервер обрабатывает его и в некоторый момент времени выдает ответ с результатами обработки. В этот момент функция MsgSend() должна возвратить ноль (0), указывая этим, что все прошло успешно. Если бы сервер послал нам в ответ какие-то данные, мы смогли бы вывести их на экран с помощью последней строки в программе (с тем предположением, что обратно мы получаем корректную ASCIIZ-строку).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Почтовый клиент Evolution

Из книги 200 лучших программ для Linux автора Яремчук Сергей Акимович

Почтовый клиент Evolution Почтовым клиентом и по совместительству программой для управления контактами и временем для оконной среды GNOME является Evolution (http://www.gnome.org/projects/evolution/). Изначально он разработан и поддерживается фирмой Novell, с сентября 2004 года входит в состав GNOME.


Многопротокольный клиент SIM

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Многопротокольный клиент SIM Simple Instant Messenger (SIM, http://sim-im.org/) – еще один многопротокольный клиент обмена сообщениями с открытыми исходными текстами, работающий, кроме Linux, на платформах, поддерживаемых используемой им библиотекой Qt: Microsoft Windows, FreeBSD и Mac OS X. Основатель проекта


Клиент Ekiga

Из книги Эффективное делопроизводство автора Пташинский Владимир Сергеевич

Клиент Ekiga В дистрибутиве Ubuntu в качестве приложения для IP-телефонии и проведения видеоконференций используется Ekiga (http://www.ekiga.org/). Первая версия этой программы была написана Демиеном Сандрасом, который сегодня является одним из руководителей проекта, в качестве дипломной


Глава 18 FTP-клиент

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Глава 18 FTP-клиент Постановка задачи Разработать FTP-клиент. Программа должна соединяться с FTP-cepвером, проходить аутентификацию и предоставлять пользователю возможность работать с файлами, которые находятся на сервере. У пользователя должна быть возможность передавать и


Почтовый клиент

Из книги Бесплатные разговоры через Интернет автора Фрузоров Сергей

Почтовый клиент В переводе с компьютерного жаргона это простая программа для приема и отправки электронной почты. Это нужная операция, поэтому программ такого рода множество. Однако Outlook – самая простая и удобная, что нетрудно доказать.Во-первых, Outlook универсален: он


10.1.2 TCP и модель клиент/сервер

Из книги Наглядный самоучитель работы на нетбуке автора Сенкевич Г. Е.

10.1.2 TCP и модель клиент/сервер TCP естественным образом интегрируется в окружение клиент/сервер (см. рис. 10.1). Серверное приложение прослушивает (listen) поступающие запросы на соединение. Например, службы WWW, пересылки файлов или доступа с терминала прослушивают запросы,


Программа-клиент

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

Программа-клиент Программа-клиент бесплатной версии Roger Wilco отличается тем, что в ее окне отсутствует вкладка Host Base Station (Обосноваться на базовой станции). Это естественно, поскольку сервер запускается отдельно и настраивается в режиме командной строки. Тем не менее,


QIP — альтернативный ICQ-клиент

Из книги Ubuntu 10. Краткое руководство пользователя автора Колисниченко Д. Н.

QIP — альтернативный ICQ-клиент Возможно, для общения в ICQ вам больше понравится альтернативный ICQ-клиент — программа QIP. Существуют две версии этой программы: QIP 2005 и OIP Infium. На нетбуке предпочтение стоит отдать более простой и компактной версии — QIP 2005.В программе QIP 2005 есть


21.5.1. Команда ftp — стандартный FTP-клиент

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

21.5.1. Команда ftp — стандартный FTP-клиент Для открытия соединения с любым FTP-сервером введите команду: ftp <имя или адрес FTP-сервера> Можно просто ввести команду ftp, а в ответ на приглашение ftp> ввести команду: open <имя или адрес FTP-сервера> Лично мне больше нравится первый


Клиент-сервер

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Клиент-сервер Средства локального доступа.* Локальная заглушка TCP/IP. Для многоуровневых серверных приложений и других клиентов доступ к локальному серверу на любой поддерживаемой платформе осуществляется через протокол TCP/IP: даже при отсутствии сетевой карты соединение


Что такое клиент Firebird?

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Что такое клиент Firebird? Клиент Firebird - это приложение, обычно написанное на языке высокого уровня, которое предоставляет конечному пользователю доступ к средствам и инструментам системы управления базами данных Firebird и к данным, хранимым в базах данных. Интерактивная


Клиент

Из книги автора

Клиент Клиент, который желает послать запрос серверу, блокируется до тех пор, пока сервер не завершит обработку запроса. Затем, после завершения сервером обработки запроса, клиент разблокируется, чтобы принять «ответ».Это подразумевает обеспечение двух условий: клиент


DHCP-клиент

Из книги автора

DHCP-клиент Данная служба используется при существовании в сети DHCP-сервера. DHCP-сервер предназначен для выдачи всем компьютерам, не имеющим постоянного IP-адреса, временного IP-адреса, чтобы они могли работать в сети. Служба является отличным средством автоматизирования


Веб-клиент

Из книги автора

Веб-клиент Служба позволяет изменять или добавлять файлы, хранящиеся в Интернете. Если эта стандартная функция Windows вам не нужна, то службу лучше отключить.Служба Веб-клиент занимает около 800 Кбайт оперативной памяти и запускается с правами локальной службы (NT


30.3. Тестовый клиент TCP

Из книги автора

30.3. Тестовый клиент TCP В листинге 30.1[1] показан клиент, который будет использоваться для тестирования всех вариаций нашего сервера.Листинг 30.1. Код клиента TCP для проверки различных версий сервера//server/client.с 1 #include "unp.h" 2 #define MAXN 16384 /* максимальное количество байтов, которые