使用多个程序版本示例

本节说明如何使用多个程序版本示例。

按照约定, PROG 程序的第一个版本号称为 PROGVERS_ORIG,最新版本为 PROGVERS。 例如,程序员可以创建新版本的 user 程序,该程序返回无符号的短值而不是长值。 如果程序员将此版本命名为RUSERSVERS_SHORT,那么以下程序允许服务器支持这两个程序:

if (!svc_register(transp, RUSERSPROG, RUSERSVERS_ORIG,
  nuser, IPPROTO_TCP)) {
    fprintf(stderr, "can't register RUSER service\n");
    exit(1);
}
if (!svc_register(transp, RUSERSPROG, RUSERSVERS_SHORT,
  nuser, IPPROTO_TCP)) {
    fprintf(stderr, "can't register RUSER service\n");
    exit(1);
}
这两个版本都可以由相同的 C 过程处理,如以下使用 nusers 过程的示例中所示:

nuser(rqstp, transp)
    struct svc_req *rqstp;
    SVCXPRT *transp;
{
    unsigned long nusers;
    unsigned short nusers2;

    switch (rqstp->rq_proc) {
    case NULLPROC:
        if (!svc_sendreply(transp, xdr_void, 0)) {
            fprintf(stderr, "can't reply to RPC call\n");
                  return (1);
        }
        return;
    case RUSERSPROC_NUM:

        /*
         * Code here to compute the number of users
         * and assign it to the variable nusers 
         */
        nusers2 = nusers;
        switch (rqstp->rq_vers) {
        case RUSERSVERS_ORIG:
            if (!svc_sendreply(transp, xdr_u_long, 
            &nusers)) {
                fprintf(stderr,"can't reply to RPC call\n");
            }
            break;

        case RUSERSVERS_SHORT:
            if (!svc_sendreply(transp, xdr_u_short, 
            &nusers2)) {
                fprintf(stderr,"can't reply to RPC call\n");
            }
            break;
        }
    default:
        svcerr_noproc(transp);
        return;
    }
}