На консоли процесса, который записывает данные:
This process writes to file!
Process wrote string: The sun is shining!
На консоли процесса, который читает данные:
This process reads from file!
Process read from file /net/QNX1/home/sam/file.txt: "The sun is shining!"
2.4. Передача сообений через неименованный канал по сети.
Чтобы передать сообщения таким способом, необходимо знать номер узла, на котором запущен сервер, его pid и id канала, по которому ведётся обмен.
При локальной передаче достаточно 2 последних характеристик.
Текст сервера:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <sys/neutrino.h>
int channelId;
void SigintHandler( int signo );
int main(int argc, char *argv[])
{
setbuf( stdout, NULL );
signal( SIGINT, SigintHandler);
// создаём буферы для обмена сообщениями
char receiveBuff[256];
char replyBuff[256];
// Создание канала для обмена сообщениями
if (( channelId = ChannelCreate(0) )==-1) {
printf( "Server: create channel error!\n" );
exit(1);
}
// определяем номер канала и id сервера
printf( "Server: create channel. CH_ID=%d, PID=%d\n", channelId, getpid() );
// Принимаем в цикле сообщение
while (1)
{
int rcvId = MsgReceive( channelId, receiveBuff, sizeof(receiveBuff), NULL );
// анализируем, что возвращает нам функция MsgReceive
switch (rcvId)
{
// Ошибка
case -1:
printf( "Server: MsgReceive error.\n" );
break;
// Если пульс, принимаем пульс
case 0:
printf( "Server: Receive pulse.\n" );
break;
// Если сообщение, принимаем сообщение и отвечаем
default:
printf( "Server: Receive msg.\n" );
printf( "Server: msg - <%s>\n", receiveBuff );
sprintf( replyBuff, "Server reply to client RCV_ID=%d", rcvId );
MsgReply( rcvId, EOK, replyBuff, sizeof(replyBuff));
break;
}
}
return EXIT_SUCCESS;
}
// обработчик для уничтожения сигнала
void SigintHandler( int signo ) {
ChannelDestroy( channelId );
exit( EXIT_SUCCESS );
}
Текст клиента:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/neutrino.h>
#include <sys/netmgr.h>
void SigintHandler( int signo );
int connectId;
int main(int argc, char *argv[])
{
setbuf( stdout, NULL );
signal( SIGINT, SigintHandler);
char sendBuff[256];
char replyBuff[256];
int channelId, ownerPid, nd;
// преобразуем аргументы командной строки в нужный нам формат
channelId = atoi( argv[1] );
ownerPid = atoi( argv[2] );
nd = netmgr_strtond( argv[3], NULL );
// присоединяемся к каналу
connectId = ConnectAttach( nd, ownerPid, channelId, 0, 0 );
if (connectId == -1 ){
printf( "Client: ConnectAttach error!" );
exit(2);
}
// отправляем сообщение
while (1) {
printf( "Message: " );
scanf( "%s", sendBuff );
if( MsgSend( connectId, sendBuff, sizeof(sendBuff),replyBuff,sizeof(replyBuff) )==-1) {
printf( "Client: MsgSend error!" );
exit(3);
}
printf( "Client: Reply msg - <%s>\n", replyBuff );
}
return EXIT_SUCCESS;
}
void SigintHandler( int signo ) {
ConnectDetach( connectId );
exit( EXIT_SUCCESS );
}
Данный тип обмена сообщениями имеет недостаток – нужно заранее знать, на каком узле находится сервер, что не всегда возможно. Поэтому гораздо удобнее использовать именованные каналы.
Проектирование с использованием IDE
3.1 Сборка отладочного комплекса (кросс-системы):
3.1.1 Установка (инсталляция) среды IDE Momentics на инструментальной машине под ОС Windows или Linux
Установка ОС QNX на удаленной целевой платформе реальной или виртуальной
Установка
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.