Скачиваний:
16
Добавлен:
01.05.2014
Размер:
1.53 Кб
Скачать
/* 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