Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тестовые примеры / ch12 / call_back / aclk_svc
.C/* server program: low-level RPC APIs */
/* usage: msg_svc2 <transport> */
#include <signal.h>
#include "aclock.h"
#include "RPC.h"
RPC_svc *svcp;
static struct arg_rec argRec;
void call_client( int signum )
{
u_long x = alarm(0); /* alarm time remaining */
RPC_cls cls( argRec.hostname, argRec.prognum, argRec.versnum, "netpath");
if (!cls.good()) {
cerr << "call_client: create RPC_cls object failed\n";
exit(1);
}
if (cls.call( argRec.procnum, (xdrproc_t)xdr_u_long, (caddr_t)&x,
(xdrproc_t)xdr_void, 0 )!=RPC_SUCCESS)
cerr << "call_client: call client failed\n";
exit(0); /* kill the child process */
}
int set_alarm( SVCXPRT* xtrp )
{
if (svcp->getargs( xtrp, (xdrproc_t)xdr_arg_rec, (caddr_t)&argRec)!=RPC_SUCCESS)
return -1;
if (svcp->reply( xtrp, (xdrproc_t)xdr_void, (caddr_t)0)!=RPC_SUCCESS)
{
cerr << "printmsg: sendreply failed\n";
return -1;
}
switch (fork()) {
case -1: perror("can't fork");
break;
case 0: /* child process */
alarm(argRec.atime);
signal(SIGALRM, call_client);
pause();
}
/* parent process */
return RPC_SUCCESS;
}
int main(int argc, char* argv[])
{
RPC_svc *svcp = new RPC_svc( ACLKPROG, ACLKVER, argc==2 ? argv[1] : "netpath");
if (svcp->run_func( ACLKPROC, set_alarm )) return 1;
return 1; /* shouldn't get here */
}
Соседние файлы в папке call_back