e-knigi.com

Основы программирования в Linux - Мэтью Нейл

На этом ресурсе Вы можете бесплатно читать книгу онлайн Основы программирования в Linux - Мэтью Нейл. Жанр: Программирование . На сайте e-Knigi.com Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

3. Сделайте сервер ответственным за создание обеих очередей сообщений:

int server starting() {

#if DEBUG_TRACE

 printf("%d :- server_starting()n", getpid());

#endif

 serv_qid = msgget((key_t)SERVER_MQUEUE, 0666 | IPC_CREAT);

 if (serv_qid == -1) return(0);

 cli_qid = msgget((key_t)CLIENT_MQUEUE, 0666 | IPC_CREAT);

 if (cli_qid == -1) return(0);

 return(1);

}

4. За удаление очереди, если она существует, также отвечает сервер. Когда сервер заканчивает работу, вы задаете недопустимые значения вашим глобальным переменным. Это позволит выловить любые ошибки при попытке сервера отправить сообщения после вызова функции

server_ending
:

void server_ending() {

#if DEBUG_TRACE

 printf("%d :- server_ending()n", getpid());

#endif

 (void)msgctl(serv_qid, IPC_RMID, 0);

 (void)msgctl(cli_qid, IPC_RMID, 0);

 servqid = -1;

 cliqid = -1;

}

5. Серверная функция

read
читает из очереди сообщение любого типа (т.е. от любого клиента) и возвращает часть сообщения с данными (пропуская тип сообщения):

int read_request_from_client(message_db_t *rec_ptr) {

 struct msg_passed my_msg;

#if DEBUG_TRACE

 printf("%d :- read_request_from_client()n", getpid());

#endif

 if (msgrcv(serv_qid, (void *)&my_msg, sizeof(*rec_ptr), 0, 0) == -1) {

  return(0);

 }

 *rec_ptr = my_msg.real_message;

 return(1);

}

6. При отправке сообщения для его адресации используется ID клиентского процесса, хранящийся в запросе:

int send_resp_to_client(const message_db_t mess_to_send) {

 struct msg_passed my_msg;

#if DEBUG_TRACE

 printf("%d :- send_resp_to_client()n", getpid());

#endif

 my_msg.real_message = mess_to_send;

 my_msg.msg_key = mess_to_send.client_pid;

 if (msgsnd(cli_qid, (void *)&my_msg, sizeof(mess_to_send), 0) == -1) {

  return(0);

 }

 return(1);

}

Пересмотр функций клиента

Теперь нужно внести изменения в клиентские функции.

1. Когда клиент стартует, ему нужно найти идентификаторы серверной и клиентской очередей. Клиент не создает очереди. Если сервер не работает, эта функция завершится аварийно, поскольку не существует очередей сообщений.

int client starting() {

#if DEBUG_TRACE

 printf("%d :- client_startingn", getpid());

#endif

 serv_qid = msgget((key_t)SERVER_MQUEUE, 0666);

 if (serv_qid == -1) return(0);

 cli_qid = msgget((key_t)CLIENT_MQUEUE, 0666);

 if (cli_qid == -1) return(0);

 return(1);

}

2. Как и в случае сервера, когда клиент завершает работу, вы задаете некорректные значения глобальных переменных. Это позволит выявить ошибки при попытке клиента отправлять сообщения после вызова функции

client_ending
.

void client_ending() {

#if DEBUG_TRACE

 printf("%d :- client_ending()n", getpid());

#endif

 serv_qid = -1;

 cli_qid = -1;

}

3. Для отправки сообщения серверу сохраните данные в своей структуре. Учтите, что вы должны задать ключ сообщения. Поскольку 0 — недопустимое значение для ключа, незаданный ключ означает, что он принимает (очевидно) случайное значение, поэтому иногда эта функция может возвращать ошибку, если значение оказывается нулевым.

int send_mess_to_server(message_db_t mess_to_send) {

 struct msg_passed my_msg;

#if DEBUG_TRACE

 printf("%d send_mess_to_server()n", getpid());

#endif

 my_msg.real_message = mess_to_send;

 my_msg.msg_key = mess_to_send.client_pid;

 if (msgsnd(serv_qid, (void *)&my_msg, sizeof(mess_to_send) , 0) == -1) {

  perror("Message send failed");

  return(0);

 }

 return(1);

}

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

int read_resp_from_server(message_db_t *rec_ptr) {

 struct msg_passed mymsg;

#if DEBUG_TRACE

 printf("%d :- read_resp_from_server()n", getpid());

#endif

 if (msgrcv(cli_qid, (void *)&my_msg, sizeof(*rec_ptr), getpid(), 0) == -1) {

  return(0);

 }

 *rec_ptr = my_msg.real_message;

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

Мэтью Нейл читать все книги автора по порядку

Мэтью Нейл - на сайте онлайн книг e-Knigi.com Вы можете читать полные версии книг автора в одном месте.


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

Отзывы читателей о книге Основы программирования в Linux, автор: Мэтью Нейл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администрация сайта e-Knigi.com


Прокомментировать
Подтвердите что вы не робот:*