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

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

#include <errno.h>

#include <process.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

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

if (argc != 2) {

printf("Wrong number of arguments\n");

return EXIT_FAILURE;

}

name_attach_t   *channel; 

dispatch_t *dpp;

int  rcvid;

char receive_buf[50], reply_buf[50];

// Cоздание контекста диспетчирезации (содержит номер создаваемого канала)

dpp = dispatch_create();  

// Регистрация префикса. 0 означает, что префикс локальный для данной ЭВМ

// При этом создаётся канал, номер которого запишется в структуру dpp

channel = name_attach(dpp, argv[1], 0);

while (1) {

// Принимаем сообщение из канала chid

rcvid = MsgReceive(channel->chid, &receive_buf, sizeof(receive_buf), NULL);

// Если не импульс, обрабатываем сообщение

if (rcvid) {

// Выведем текст принятого сообщения

printf("Server: message from client \"%s\"\n", &receive_buf );

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

strcpy(reply_buf, "Hello from server");

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

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

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

}

}

// Уничтожаем префикс и канал

name_detach(channel, 0);

return EXIT_SUCCESS;

}

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

#include <sys/neutrino.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <errno.h>

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

if (argc != 2) {

printf("Wrong number of arguments\n");

return EXIT_FAILURE;

}

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

int coid, pid = getpid();

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

int status;

// Буферы для отправляемого и принимаемого сообщений

char send_buf[50], reply_buf[50];

// Присоединение к каналу. Для этого нам нужно знать только имя префикса и его тип (0 - локальный)

coid = name_open(argv[1], 0);

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

sprintf(send_buf, "Hello 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);

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

name_close(coid);

return EXIT_SUCCESS;

}

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

1)  На стороне сервера

#include <sys/iofunc.h>

#include <sys/dispatch.h>

name_attach_t * name_attach( dispatch_t * dpp,

const char * path,

unsigned flags ); - регистрация префикса и создание канала

int name_detach( name_attach_t *attach,

unsigned flags ); - уничтожение префикса и канала

2)  На стороне клиента

#include <sys/iofunc.h>

#include <sys/dispatch.h>

int name_open( const char * name,

int flags ); - присоединение к каналу по имени

int name_close( int coid ); - закрытие соединения

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

Рис. 1.7. Результат

Сначала был запущен сервер, регистрирующий префикс channel, который мы указали в качестве аргумента. Затем запустили клиента, также указав ему имя. Клиент передал сообщение серверу, тот его получил и отправил ответ.