printf("REPLY:\"%s\"\n",rmsg);
}
}
Текст сервера
# include <stdio.h>
#include <sys/neutrino.h>
#include<errno.h>
#include<stdlib.h>
int main(){
int pid=getpid();
FILE * pFile;
pFile=fopen ("out.txt","w");
fprintf(pFile,"%d\n",pid);
fclose(pFile);
int rcvid;
int chid;
char message[512];
chid=ChannelCreate(0);
while(1){
rcvid=MsgReceive(chid,message,sizeof(message),NULL);
printf("receive message,rcvid %X\n",rcvid);
printf("message: \"%s\".\n",message);
strcpy(message,"reply");
MsgReply(rcvid,EOK,message,sizeof(message));
}}
Посмотрим результат программы в QNX:
Видим, что сервером принято сообщение и отправлен ответ.
Теперь запустим первым клиент и посмотрим, что будет:
В итоге получаем ошибку присоединения к каналу, так как сервер не запущен и поэтому канал не создан.
2.1.3. Сетевые независимые процессы.
Для такой реализации тоже нужно 2 программы: клиент и сервер. Обмен сообщениями будем производить через именованный канал.
Текстсервера:
#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 "msg_header.h"
void sig_int(void);
name_attach_t *attach;
int main(int argc, char *argv[]) {
int rcvid;
msg_my_t msg_rcv, msg_rpl;
// СОЗДАЁМ КАНАЛ ДЛЯ ОБМЕНА СООБЩЕНИЯМИ
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, &msg_rcv, sizeof(msg_rcv), NULL);
if(rcvid > 0){
printf("Receive message %d: %s\n, msg_rcv.mes);
strcpy(msg_rpl.mes,"Transfer is qood!");
msg_rpl.length=strlen(msg_rpl.mes);
MsgReply(rcvid, EOK, &msg_rpl, sizeof(msg_rpl));
}
else if(rcvid == -1){
printf("ERROR: MsgReceive\n");
}
}
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 "../msg_local_server/msg_header.h"
int main(void){
int coid;
int count=0;
msg_my_t msg_send, msg_reply;
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());
}
while(1){
gets(msg_send.mes);
if(MsgSend(coid, &msg_send, sizeof(msg_send), &msg_reply, sizeof(msg_reply)) == -1){
printf("Error send MSG\n");
}
else{
printf("Reply: %s\n",msg_reply.mes);
}
}
}
Посмотрим результаты:
На консоли сервера:
SERVER STARTED
Receive message: _
Receive message: hello
Видим, что при подключении к каналу сначала передаётся пульс, а потом только наше сообщение.
Консоль коиента:
START CLIENT pid #495654
hello
Reply: Transfer is qood!
На консоли клиента мы печатаем сообщение, которое хотим передать. В ответ на него сервер отправляет сообщение, которое мы видим ниже.
2.1.4. Потоки одного процесса.
Текст программы.
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <sys/neutrino.h>
#include <string.h>
#include <errno.h>
#include "header.h"
name_attach_t *attach;
void sig_int(void){
printf("Terminate SERVER\n");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.