Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

resp.cdt_entry_data =

get_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no);

break;

 case s_add_cdc_entry:

if (!add_cdc_entry(comm.cdc_entry_data))

resp.response = r_failure;

break;

 case s_add_cdt_entry:

if (!add_cdt_entry(comm.cdt_entry_data))

resp.response = r_failure;

break;

 case s_del_cdc_entry:

if (!del_cdc_entry(comm.cdc_entry_data.catalog))

resp.response = r_failure;

break;

 case s_del_cdt_entry:

if (!del_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no)) resp.response = r_failure;

break;

 case s_find_cdc_entry:

do {

resp.cdc_entry_data =

search_cdc_entry(comm.cdc_entry_data.catalog, &first_time);

if (resp.cdc_entry_data.catalog[0] != 0) {

resp.response = r_success;

if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

break;

}

} else {

resp.response = r_find_no_more;

}

} while (resp.response == r_success);

break;

 default:

resp.response = r_failure;

break;

 } /* switch */

 sprintf(resp.error_text,

"Command failed:\n\t%s\n", strerror(save_errno));

 if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

 }

 end_resp_to_client;

 return;

}

Прежде чем рассматривать действующую реализацию канала, давайте обсудим последовательность событий, которые должны произойти для передачи данных между клиентским и серверным процессами. На рис. 13.9 показан запуск обоих, и клиентского, и серверного, процессов, а также то, как они образуют петлю во время обработки команд и ответов.

В этой реализации ситуация немного сложнее, т.к. в запросе на поиск клиент передает серверу одну команду и затем ждет один или несколько ответов от сервера. Это усложняет программу, особенно клиентскую часть.

Рис. 13.9 

Канал

Далее показан файл реализации канала pipe_imp.с, в котором содержатся клиентские и серверные функции.

Примечание

Как вы видели в главе 10, может быть определено символическое имя DEBUG_TRACE для того, чтобы показать последовательность вызовов, в которых клиентский и серверный процессы передают друг другу сообщения.

Заголовочный файл для реализации канала

1. Прежде всего, директивы

#include
:

#include "cd_data.h"

#include "cliserv.h"

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

static int server_fd = -1;

static pid_t mypid = 0;

static char client_pipe_name[PATH_MAX + 1] = {'\0'};

static int client_fd = -1;

static int client_write_fd = -1;

Функции серверной стороны

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

Функции сервера
  • Читать дальше
  • 1
  • ...
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: