2.2.1.2.Независимые процессы (сетевая реализация).
Сервер анализирует, что возвращает функция MsgReceive().
Текст сервера
#include <stdlib.h>
#include <stdio.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <sys/neutrino.h>
#include <string.h>
#include <errno.h>
#include "header.h"
void sig_int(void);
name_attach_t *attach;
int main(int argc, char *argv[]) {
char replybuf[64];
struct _pulse my_pulse;
int rcvid;
// СОЗДАЁМ КАНАЛ ДЛЯ ОБМЕНА СООБЩЕНИЯМИ
attach = name_attach(NULL, ATTACH_POINT,NAME_FLAG_ATTACH_GLOBAL);
if (attach == NULL){
printf("ERROR: %s\n",strerror(errno));
return EXIT_FAILURE;
}
else{
signal(SIGINT,sig_int);
printf("SERVER STARTED\n");
}
// ЖДЁМ СООБЩЕНИЯ
while(1){
rcvid = MsgReceive(attach->chid,&my_pulse,sizeof(my_pulse),NULL);
if (rcvid > 0){
//ЭТО СООБЩЕНИЕ
if (my_pulse.type = _IO_CONNECT){
MsgReply(rcvid,EOK,NULL,0);
continue;
}
else{
printf("server: msg received from %d\n", rcvid);
strcpy(replybuf,"Transfer is qood!\n");
MsgReply(rcvid,EOK,replybuf,sizeof(replybuf));
}
}
else if (rcvid == 0){
//ЭТО ПУЛЬС
printf("server: received pulse: code=%d; value=%d;\n",my_pulse.code,my_pulse.value.sival_int);
}
else{
//ОШИБКА
printf("server: transfer failed\n");
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
void sig_int(void){
printf("Terminate SERVER\n");
name_detach( attach, 0 );
exit(EXIT_SUCCESS);
}
Текст клиента:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/dispatch.h>
#include "header.h"
int main(void){
int coid;
coid = name_open( ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL);
if(coid == -1){
printf("can not find server\n");
return EXIT_FAILURE;
}
else{
printf("START CLIENT pid #%d\n",getpid());
}
MsgSendPulse(coid, 12, 5, 1);
printf("client: pulse sending\n");
}
Текст хидера, в котором определено имя канала, по которому происходит обмен:
#include <sys/dispatch.h>
#ifndef MSG_HEADER_H_
#define MSG_HEADER_H_
#define ATTACH_POINT "pulse_server"
#define lenmes 256
#endif /* MSG_HEADER_H_ */
Результаты:
Консоль клиента:
START CLIENT pid #802854
client: pulse sending
Консоль сервера
SERVER STARTED
server: received pulse: code=5; value=1;
server: received pulse: code=-33; value=0;
При отсоединении от канала тоже передаётся пульс с значением 0 и кодом -33.
2.2.2. Реализация пульсов специальными средствами (родственные процессы).
Теперь сервер не должен анализировать, что он принимает. Ему заранее известно, что придёт пульс.
Текст программы:
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <errno.h>
#include <sys/neutrino.h>
int main(int argc, char *argv[]) {
int chid;
int rcvid;
//СОЗДАЕМ КАНАЛ
chid=ChannelCreate(0);
if (fork()==0){
//ПРОЦЕСС-СЫН
int coid;
printf("child started\n");
//ПОДСОЕДИНЯЕМСЯ К КАНАЛУ
coid=ConnectAttach( 0, getppid(), chid, 0, 0 );
if (coid > 0){
MsgSendPulse(coid, 12, 5, 8);
printf("child: pulse sending\n");
}
else {
printf("Error: connection failed\n");
return EXIT_FAILURE;
}
}
else{
//ПРОЦЕСС-ОТЕЦ
struct _pulse my_pulse;
printf("father started\n");
rcvid = MsgReceivePulse(chid,&my_pulse,sizeof(my_pulse),NULL);
if (rcvid == -1){
printf("father: MsgReceivePulse failed\n");
return EXIT_FAILURE;
}
else {
printf("father: received pulse: code=%d; value=%d;",my_pulse.code,my_pulse.value.sival_int);
}
}
return EXIT_SUCCESS;
}
Результаты:
father started
child started
child: pulse sending
father: received pulse: code=5; value=8;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.