Читаем Основы программирования в Linux полностью

    "Server ended — can not read pipe\n");

   server_running = 0;

  }

 } /* while */

 server_ending;

 exit(EXIT_SUCCESS);

}

3. Любые сообщения клиентов направляются в функцию process_command, где они обрабатываются в операторе case, который выполняет соответствующие вызовы из файла cd_dbm.c.

static void process_command(const message_db_t comm) {

 message_db_t resp;

 int first_time = 1;

 resp = comm; /* копирует команду обратно,

                 затем изменяет resp, как требовалось */

 if (!start_resp_to_client(resp)) {

  fprintf(stderr, "Server Warning:

   start_resp_to_client %d failed\n", resp.client_pid);

  return;

 }

 resp.response = r_success;

 memset(resp.error_text, '\0', sizeof(resp.error_text));

 save_errno = 0;

 switch(resp.request) {

 case s_create_new_database:

  if (!database initialize(1))

   resp.response = r_failure;

  break;

 case s_get_cdc_entry:

  resp.cdc_entry_data =

   get_cdc_entry(comm.cdc_entry_data.catalog);

  break;

 case s_get_cdt_entry:

  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 

<p>Канал</p>

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

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT