Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux和Solaris之间的RPC通信_Linux_Solaris_Rpc - Fatal编程技术网

Linux和Solaris之间的RPC通信

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您解决了问题吗?我也有同样的问题,但我可以

我有一个运行在Solaris中的RPC服务器。我有一个RPC客户端,它在Solaris中运行良好。
当我在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);