RPC服务器故障分析

void

square_prog_2(char *host)

{

         CLIENT *clnt;

         enum clnt_stat retval_1;

         square_out result_1;

         square_in  squareproc_2_arg;

         squareproc_2_arg.arg = 11;

         clnt = clnt_create (host, square_prog, square_vers, "udp");

         if (clnt == NULL) {

                   clnt_pcreateerror (host);

                   exit (1);

         }

         retval_1 = squareproc_2(&squareproc_2_arg, &result_1, clnt);

         if (retval_1 != RPC_SUCCESS) {

                   clnt_perror (clnt, "call failed");

         }

         clnt_destroy (clnt);

         printf("%d\n", result_1.res);

}

 

bool_t

squareproc_2_svc(square_in *argp, square_out *result, struct svc_req *rqstp)

{

 

         result->res = argp->arg * argp->arg;

         printf("result = %d\n”, result->res);

         return TRUE;

}

 

以上代码为一个简单RPC程序调用的主体部分,RPC服务器端程序的返回值为bool类型(TRUE或者FALSE),正常结束时,RPC服务器应该返回TRUE,下面对于服务器不能正常完成服务的两种情况进行分析:

1.  在服务器实现中返回FALSE

Ÿ   如果客户端创建的句柄为udp类型,则每隔5sudp重传超时时间),服务器端的方法被重新调用,5次后,客户端提示超时(25s为总超时时间)。

Ÿ   如果客户端创建的句柄为tcp类型,则服务器方法被调用一次,客户端在25s后提示超时。

 

2.  服务器宕机或网络不通等

Ÿ   如果客户端创建的句柄为udp类型,则在创建句柄阶段不会出错(udp不需要建立连接),而在调用阶段会出错,提示call failedRPC: Unable to receiveerrno = Connection refused;

Ÿ   如果客户端创建的句柄为tcp类型,则在创建句柄阶段就会出错(tcp的三次握手),提示192.168.1.72RPC: Remote system error – Connection refused;

 

posted @ 2013-04-19 14:06  ydzhang  阅读(730)  评论(0编辑  收藏  举报