Программа 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, который мы указали в качестве аргумента. Затем запустили клиента, также указав ему имя. Клиент передал сообщение серверу, тот его получил и отправил ответ.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.