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