math_server.c

来自「linux 高级编程的例子源码,包括了本书上的所有代码」· C语言 代码 · 共 92 行

C
92
字号
#include "xdr_math.h"

static void mathprog(struct svc_req *rqstp,SVCXPRT *transp)
{
struct MATH math;

switch(rqstp->rq_proc)
{
    case NULLPROC:
        svc_sendreply(transp,(xdrproc_t)xdr_void,NULL);
        return ;
    case MATH_PROC:
        break;
    default:
        svcerr_noproc(transp);
        return ;
}
    memset ((char *)&math, 0, sizeof (math));
	if (!svc_getargs (transp, (xdrproc_t)xdr_math, (caddr_t) &math)) 
    {
		svcerr_decode (transp);
		return;
	}

switch(math.op)
{
    case ADD:
       math.result=math.arg1+math.arg2;
       break;
    case SUB:
       math.result=math.arg1-math.arg2;
       break;
    case MUL:
       math.result=math.arg1*math.arg2;
       break;
    case DIV:
       math.result=math.arg1/math.arg2;
       break;
    default:
       break;
}

if (!svc_sendreply(transp,(xdrproc_t)xdr_math,(caddr_t)&math))
{
		printf ("error: unable to send reply");
		exit (1);
	} 

if (!svc_freeargs (transp,(xdrproc_t) xdr_math, (caddr_t) &math)) 
{
		printf ("error: unable to free arguments");
		exit (1);
	} 

return ;
}
int main (int argc, char **argv)
{
	register SVCXPRT *transp;

	transp = svcudp_create(RPC_ANYSOCK);
	if (transp == NULL) 
    {
		printf ("error: cannot create udp service.");
		exit(1);
	}
	if (!svc_register(transp, MATH_PROG, MATH_VER, mathprog, IPPROTO_UDP)) 
    {
		printf("error: unable to register (MATH_PROG, VER, udp).\n");
		exit(1);
	}

	transp = svctcp_create(RPC_ANYSOCK, 0, 0);
	if (transp == NULL) 
    {
		printf ("error: cannot create tcp service.");
		exit(1);
	}
	if (!svc_register(transp, MATH_PROG, MATH_VER, mathprog, IPPROTO_TCP)) 
    {
		printf ("error: unable to register (ADDPROG, VER, tcp).");
		exit(1);
	}

	svc_run ();
	printf ("error: svc_run returned");
	exit (1);
	/* NOTREACHED */
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?