MsgReply( rcv_id, EOK, NULL, 0 );
} else {
ClientMsgProc( );
}
break;
}
}
// Удаление канала //
name_detach( msg_chanel, 0 );
return EXIT_SUCCESS;
}
void Sigint_Handler( int signo ) {
// Удаление канала //
name_detach( msg_chanel, 0 );
printf( "\nSetver: terminate. Chanel delete.\n" );
exit(EXIT_SUCCESS);
}
void PulseProc( )
{
time_t tmm;
struct tm *now;
switch( msg.pulse_msg.code )
{
// Пульс от таймера //
case CODE_TIMER:
tmm = time( NULL );
now = localtime( &tmm );
printf( "Recieved pulse from Timer: %2.2d:%2.2d:%2.2d.\n", now->tm_hour, now->tm_min, now->tm_sec );
break;
// Пульс из прерывания клавиатуры //
case CODE_KBD_INT:
printf( "Recieved pulse from Kbd_Isr. KeyNum=%d.\n", msg.pulse_msg.value.sival_int );
break;
default:
break;
}
}
void ClientMsgProc( )
{
printf( "PID=%d, ND=%d. ", msg_info.pid, msg_info.nd );
printf( "Recieved Message: %s\n", msg.msg_buff );
strcpy( msg.msg_buff, "OK!" );
MsgReply( rcv_id, EOK, &msg, sizeof(msg) );
}
Листинг 2.4.2. Программа клиента. 2_2_4_msg_client_name_open.c.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "qnx_msg_server"
#define BUF_LEN 256
void sigint_handler( int );
int connect_id;
int main( int argc, char *argv[] )
{
char send_buff[ BUF_LEN ];
char reply_buff[ BUF_LEN ];
if (argc < 2) {
printf( "Client: 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( "Client: cmd args error!\n" );
exit(2);
}
// Отключаем буферизацию вывода //
setbuf( stdout, NULL );
// Открытие канала //
connect_id = name_open( ATTACH_POINT, flag );
if (connect_id == -1) {
printf( "Client: name open error!\n" );
exit(3);
}
printf( "Client: started. PID=%d.\n", getpid() );
signal( SIGINT, sigint_handler );
while(1)
{
printf( "Message: ");
scanf( "%s", send_buff );
if ( MsgSend( connect_id, send_buff, sizeof(send_buff), reply_buff, sizeof(reply_buff) ) == -1 ) {
printf( "Client: send msg error!\n" );
break;
}
printf( "Server reply message: %s \n", reply_buff );
fflush( stdout );
}
// Закрытие локального канала //
name_close( connect_id );
return EXIT_SUCCESS;
}
void sigint_handler( int signo ) {
// Закрытие канала //
name_close( connect_id);
printf( "\nClient: terminate.\n" );
exit(0);
}
Результаты работы программы. Программы тестировались в лаборатории на одном (локальная передача) и нескольких (сетевая передача) компьютерах.
Локальный вариант.
Server |
Client |
$ ./server -l Server: started. PID=1490999, ND=0. Recieved Message: yo! PID=1490999, ND=0. Recieved Message: 666 PID=1495096, ND=0. Recieved Message: qwerty Setver: terminate. Chanel delete. $ |
$ ./client -l Client: started. PID=1490999. Message: yo! Server reply message: OK! Message: 666 Server reply message: OK! Message: Client: terminate. $ |
Сетевой вариант.
Предварительно надо запустить gns на используемых узлах сети.
/usr/sbin/gns -s — на компьютере сервера и /usr/sbin/gns -с на компьютере сервера.
Server |
Client |
# /home/gr40812/dorogoff/msg/server -g Server: started. PID=1396784, ND=2. Recieved Message: jfj PID=1396784, ND=2. Recieved Message: fkl Setver: terminate. Chanel delete. $ |
# ./client -g Client: started. PID=1396784. Message: jfj Server reply message: OK! Message: fkl Server reply message: OK! Message: Client: terminate. |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.