Добавил:
          
          
        
        
    
            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
          
      
    
    
    
          