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类型,则每隔5s(udp重传超时时间),服务器端的方法被重新调用,5次后,客户端提示超时(25s为总超时时间)。
Ÿ 如果客户端创建的句柄为tcp类型,则服务器方法被调用一次,客户端在25s后提示超时。
2. 服务器宕机或网络不通等
Ÿ 如果客户端创建的句柄为udp类型,则在创建句柄阶段不会出错(udp不需要建立连接),而在调用阶段会出错,提示call failed:RPC: Unable to receive;errno = Connection refused;
Ÿ 如果客户端创建的句柄为tcp类型,则在创建句柄阶段就会出错(tcp的三次握手),提示192.168.1.72:RPC: Remote system error – Connection refused;