channelId = ChannelCreate(0);
sleep(1);
// Прием сообщения //
rcvId = MsgReceive(channelId, receiveBuff, sizeof(receiveBuff), NULL);
printf ( "Server: message <%s> received \n", receiveBuff );
strcpy(replyBuff, "Msg from Server. OK!");
// Передача ответа //
MsgReply( rcvId, EOK, replyBuff, sizeof(replyBuff) );
ChannelDestroy( channelId );
pthread_exit(NULL);
}
// Потоки клиентов //
void* client( void* param )
{
int connectId;
char sendBuff[256],
replyBuff[256];
pid_t pid = getpid();
// Создать соединение //
connectId = ConnectAttach( 0, pid, channelId, 0, 0 );
// Передача сообщения //
strcpy( sendBuff, "Msg example");
MsgSend( connectId, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff) );
printf ( "Client: message <%s> received \n", replyBuff );
// Уничтожить соединение //
ConnectDetach( connectId );
pthread_exit( NULL );
}
Результаты работы:
Программы запускались прямо из IDE(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.
Server: message <Msg example> received
Client: message <Msg from Server. OK!> received
2.3. Передача сообщений между независимыми процессами (не именованные каналы).
Для возможности передачи сообщения, необходимо создать соединение с каналом. А это можно сделать, если известны три параметра — ND/PID/CHID.
Обмен сообщениями между клиентом и сервером организован следующим образом.
Сервер создает канал. Параметры ND/PID/CHID передаются клиенту в качестве аргументов командной строки.
Листинг 2.3.1. Программа-сервер. 2_2_3_msg_server_ChannelCreate.c.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <signal.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);
}
printf( "Server: create channel. CH_ID=%d\n", channelId );
// Прием сообщений //
while (1)
{
int rcvId = MsgReceive( channelId, receiveBuff, sizeof(receiveBuff), NULL );
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 );
}
Листинг 2.3.2. Программа-клиента. 2_2_3_msg_client_ConnectAttach.c.
#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) {
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.