Обмен сообщениями и импульсами в ОС QNX. Обмен сообщениями при стандартной организации модели "клиент-сервер", управляемой по запросу, страница 6

#include <sys/neutrino.h>

#include <errno.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <process.h>

int main (int argc, char *argv[]) {

if (argc != 2) {

printf("Wrong number of arguments");

return EXIT_FAILURE;

}

// Идентификаторы канала и клиента

int chid, rcvid;

// Буфер для ответа

char reply_buf[50];

// Для сохранения входящего пульса

struct _pulse pulse;

// Создание канала

chid = ChannelCreate(0);  

while(1) {

if (argv[1][0] == 'm') {

rcvid = MsgReceive(chid, &pulse, sizeof(pulse), NULL);

if (!rcvid) {

// Импульс

printf("Server: pulse from client: pulse.code = %d, pulse.value = %d\n", pulse.code, pulse.value);

}

else {

// Сообщение

printf("Server: message from client\n");

// Запишем в буфер ответа сообщение для клиента

strcpy(reply_buf, "Hello from server");

// Отправим ответ

printf("Server: send message \"%s\"\n", &reply_buf );

MsgReply(rcvid, EOK, &reply_buf, sizeof(reply_buf));

}

}

else {

// Импульс

MsgReceivePulse(chid, &pulse, sizeof(pulse), NULL);

printf("Server: pulse from client: pulse.code = %d, pulse.value = %d\n", pulse.code, pulse.value);

}

}

// Уничтожаем канал

ChannelDestroy(chid);

return EXIT_SUCCESS;

}

Программа client3.c:

#include <sys/neutrino.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main (int argc, char* argv[]) {

if (!(argv[2][0] == 'm' && argc == 3)  && !(argv[2][0] == 'p' && argc == 5)) {

printf("Wrong arguments\n");

return EXIT_FAILURE;

}

// Идентификаторы соединения, данного процесса и процесса-сервера

int coid, pid = getpid(), server_pid = atoi(argv[1]);

// Возвращаемое значение MsgSend

int status;

// Буферы для сообщений   

char send_buf[50], reply_buf[50];

// Устанавливаем соединение

coid = ConnectAttach(0, server_pid,  2, 0, 0);

if (argv[2][0] == 'm') {

// Запишем в буфер текст сообщения для сервера 

sprintf(send_buf, "It's message from client with PID = %d", pid);

// Отправляем сообщение и принимаем ответ со статусом

printf("Client: send message \"%s\"\n", &send_buf);

status = MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

if (status == -1) {

printf("Error of MsgSend\n");

return EXIT_FAILURE;

}

printf("Client: message \"%s\" from server\n", &reply_buf);

}

else {

// Отправляем импульс

int code  = atoi(argv[3]);

int value = atoi(argv[4]);

printf("Client: send pulse: pulse.code = %d, pulse.value = %d\n", code, value);

MsgSendPulse(coid, 10, code, value);

}

// Закрываем соединение

ConnectDetach(coid);

return EXIT_SUCCESS;

}

Использованные функции:

#include <sys/neutrino.h>

int MsgReceivePulse( int chid,

void * pulse,

int bytes,

struct _msg_info * info ); - принятие импульса

int MsgSendPulse ( int coid,

int priority,

int code,

int value ); - отправка импульса процессу

Результаты представлены на рис. 1.9.

Рис. 1.9. Результат выполнения программ

Проверка проводилась в два этапа.

На первом этапе сервер обрабатывал входящие сообщения и импульсы с помощью функции MsgReceive(). Для этого мы передали параметр ¢m¢ при его запуске. Один клиент отправил сообщение и получил ответ от сервера, другой - пульс с заданным кодом и значением, сервер его также получил, но ответа не последовало, как и должно быть.

На втором этапе сервер обрабатывал только пульсы, используя MsgReceivePulse(). Первый клиент отправил пульс, и сервер его получил. Второй клиент послал сообщение, но поскольку сервер не вызывает MsgReceive(), остался заблокированным по передаче (Send-blocked) (рис. 1.10).

Рис. 1.10. Клиент остался заблокированным по передаче