无法在用于服务器注册的远程过程调用中对参数进行编码

Can't Encode Arguments in Remote Procedure Call for Server Registration

我有点发疯了,想弄清楚为什么这不起作用。我正在使用 sunrpc,但生成的服务器代码抛出以下内容:

Cannot register service: RPC: Can't encode arguments
unable to register (MYRPC, MYRPC_V1, udp).

我不知道为什么会这样。我正在执行以下操作来生成存根:

$ rpcgen -NMC myrpc.x

这是我的 XDR

struct imgdata{
    opaque data<>;
};

program MYRPC {
    version MYRPC_V1 {
        imgdata minify(imgdata) = 1;
    } = 1;
} = 0x30D0D0DFF;

我在编译 .x 文件以创建客户端、服务器、xdr 编组代码或 header 时没有遇到任何错误。我还实现了 rpc 接口,但无法对其进行测试,因为在我尝试启动生成的服务器 (myrpc_svr.c) 时抛出了该错误 (myrpc_svr.c)。

此错误消息指的是什么参数?它不喜欢我在 XDR 中定义的函数的实现吗?为什么编码参数会导致程序甚至不注册?

我真的很惊讶这不是客户端错误消息

经过几个小时的浪费,结果证明答案很简单:节目编号超出范围

program MYRPC {
    version     MYRPC_V1 {
        imgdata minify(imgdata) = 1;
    } = 1;
} = 0x30D0D0DFF;

我的程序编号 0x30D0D0DFF 包含一个额外的数字,最后的 F 导致此值超出范围根据 section 7.3 of RFC 1831 中的规范允许的用户定义程序编号。应该是:

0x30D0D0DF.

所以这只是我在编写 XDR 文件时发现的一个微妙的错字,但我将其保留以防其他人遇到同样的问题。请确保您的节目编号正确!