Linux和Solaris之间的RPC通信
我有一个运行在Solaris中的RPC服务器。我有一个RPC客户端,它在Solaris中运行良好。Linux和Solaris之间的RPC通信,linux,solaris,rpc,Linux,Solaris,Rpc,我有一个运行在Solaris中的RPC服务器。我有一个RPC客户端,它在Solaris中运行良好。 当我在Ubuntu中编译并运行相同的代码时,我在服务器中得到了错误解码参数 Solaris使用SunRPC(ONC RPC)。不确定如何找到rpc的版本 Linux和Solaris中可用的RPC之间有什么区别吗? Solaris和Linux中生成的xdr之间是否存在任何不匹配 我应该如何发现这个问题 注意:无法发布代码@twalberg,@cppcoder您解决了问题吗?我也有同样的问题,但我可以
当我在Ubuntu中编译并运行相同的代码时,我在服务器中得到了
错误解码参数
Solaris使用SunRPC(ONC RPC)。不确定如何找到rpc的版本
Linux和Solaris中可用的RPC之间有什么区别吗?
Solaris和Linux中生成的xdr之间是否存在任何不匹配
我应该如何发现这个问题
注意:无法发布代码@twalberg,@cppcoder您解决了问题吗?我也有同样的问题,但我可以发布我的代码,如果它将是有益的。代码的某些部分是:
/*现在分配一个LoopListRequestStruct并用请求数据填充它*/
llrs = malloc(sizeof(LoopListRequestStruct));
fill_llrs(llrs);
/* Now, make the client request to the bossServer */
client_call_status = clnt_call(request_client, ModifyDhctState,
(xdrproc_t)xdr_LoopListRequestStruct,
(caddr_t)llrs,
(xdrproc_t)xdr_void,
0,
dummy_timeval
);
空白填充(LoopListRequestStruct*llrs)
{
}我在与同一软件集成时遇到了这个错误。Linux版本确实创建了错误的请求。这种行为的原因是空c字符串的序列化。SUN rpc的Glibc版本无法对它们进行编码,xdr_字符串返回零。但是您正在处理的示例将“pin”设置为0。只需将“pin”替换为“”,或者在xdr_string()上创建一些包装器,示例就可以工作了
我的PowerKey示例补丁如下所示:
< if (!xdr_string(xdrs, objp, PIN_SZ))
< return (FALSE);
< return (TRUE);
---
> char *t = "";
> return xdr_string(xdrs, *objp? objp : &t , PIN_SZ);
char*t=“”;
>返回xdr_字符串(xdrs,*objp?objp:&t,PIN_SZ);
当然,这可以简化。一般来说,您应该修复生成代码的用法,在我的例子中,它是由软件作者提供的示例源中的“pin”变量,必须在xdr_string()调用之前进行初始化。注意,xdr将处理endianness,但如果您使用特定于应用程序的不透明字段,如果您自己不处理endianness,解码将中断。确保整数以XDR整数的形式发送,而不使用代码,这将很难确定实际问题,但想到的一个主要问题是,您是否始终记得进行字节顺序转换…Solaris的ONC RPC版本与操作系统不同,它只是该Solaris版本的版本,无论您应用了什么补丁或软件包更新来修复错误。@twalberg有什么原因使代码在Solaris中工作而不是在Linux中工作?我的意思是在Linux和Solaris中发送请求的方式?是Solaris平台x86还是SPARC?SPARC是big-endian,x86是little-endian。如果没有正确处理字节顺序,那么可以想象SPARC可以与SPARC和x86到x86通信,但不能在SPARC和x86之间通信,因为数据包中的字节顺序不同。@twalberg这一行取自SPARC到x86指南公司中的大多数现代协议都是外部数据表示(XDR)层,在传输过程中,如果需要,哪个字节交换数据
RPC使用XDR,应该注意,对吗?您指的是什么“pin”?我必须在哪里替换“”?您有Zeratul上面显示的代码片段吗?也许我们在谈论不同的软件。我在处理PowerKey时解决了这个问题。不管怎么说,问题和你描述的一模一样。
< if (!xdr_string(xdrs, objp, PIN_SZ))
< return (FALSE);
< return (TRUE);
---
> char *t = "";
> return xdr_string(xdrs, *objp? objp : &t , PIN_SZ);