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(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.
Локальный вариант:
Параметры командной строки для клиента - 1 3272741 QNX_VM. (Указываются в Run Configuration → Arguments ).
Сервер |
Клиент |
Server: create channel. CH_ID=1, PID=3272741 Server: Receive msg. Server: msg - <hi!> Server: Receive msg. Server: msg - <;lkf> Server: Receive msg. Server: msg - <2> |
Message: hi! Client: Reply msg - <Server reply to client RCV_ID=2> Message: ;lkf Client: Reply msg - <Server reply to client RCV_ID=2> Message: 2 Client: Reply msg - <Server reply to client RCV_ID=2> Message: |
Сетевой вариант:
Параметры командной строки для клиента 1 495639 Ead3ec8f. (Указываются в Run Configuration → Arguments ).
Сервер |
Клиент |
Server: create channel. CH_ID=1, PID=495639 Server: Receive msg. Server: msg - <sd> Server: Receive msg. Server: msg - <12343> Server: Receive msg. Server: msg - <3> |
Message: sd Client: Reply msg - <Server reply to client RCV_ID=2> Message: 12343 Client: Reply msg - <Server reply to client RCV_ID=2> Message: 3 Client: Reply msg - <Server reply to client RCV_ID=2> Message: |
2.4. Передача сообщений между независимыми процессами (именованные каналы).
Программа сервера сделана несколько универсальной, и используется дальше в исследовании пульсов.
Листинг 2.4.1. Программа сервера. 2_2_4_msg_server_name_attach.c.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "qnx_msg_server"
#define BUF_LEN 256
#define CODE_TIMER 1
#define CODE_KBD_INT 2
typedef union {
struct
_pulse pulse_msg;
char msg_buff[ BUF_LEN ];
} Msg_T;
void Sigint_Handler( int );
void PulseProc( );
void ClientMsgProc();
name_attach_t* msg_chanel;
dispatch_t* dpp;
Msg_T msg;
int rcv_id;
struct
_msg_info msg_info;
int main( int argc, char *argv[] )
{
// Проверка командных опций программы //
if( argc < 2 ) {
printf( "Server: cmd args error!\n" );
exit(1);
}
unsigned int flag;
if (strcmp(argv[1],"-l" ) == 0) flag = 0;
else if (strcmp(argv[1],"-g" ) == 0) flag = NAME_FLAG_ATTACH_GLOBAL;
else {
printf( "Server: cmd args error!\n" );
exit(2);
}
// Отключаем буферизацию вывода //
setbuf( stdout, NULL );
// Регистрация канала //
dpp = dispatch_create( );
msg_chanel = name_attach( dpp, ATTACH_POINT, flag );
if (msg_chanel == NULL){
printf( "Server: name attach error!\n" );
exit(3);
}
printf( "Server: started.\n");
// Завершение сервера по SIGINT //
signal( SIGINT, Sigint_Handler );
// Цикл ожидания и приема сообщений //
while (1)
{
rcv_id = MsgReceive( msg_chanel->chid, &msg, sizeof(msg), &msg_info );
switch (rcv_id)
{
// Ошибка //
case -1:
printf( "Server: msg receive error!\n" );
exit(4);
break;
// Принят пульс //
case 0:
PulseProc( );
break;
// Принято сообщение //
default:
if (msg.pulse_msg.type == _IO_CONNECT ) {
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.