linux - Linux 和 Solaris 之间的 RPC 通信

标签 linux solaris rpc

我有一个在 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
    );

void fill_llrs(LoopListRequestStruct* llrs) {

Descriptor_Loop* dl = 0;
DhctState_d *dhct_state_ptr = 0;
PackageAuthorization_d *pkg_auth_ptr = 0; 

llrs->TRANS_NUM = 999999;   /* strictly arbitraty, use whatever you want */
                                                    /* the bossServer simply passes this back in */
                                                    /* in the response you use it to match       */
                                                    /* request/response if you want or you can   */
                                                    /* choose to ignore it if you want           */

/* now set the response program number, this is the program number of  */
/* transient program that was set up using the svc_reg_utils.[ch]      */
/* it is that program that the response will be sent to                */

llrs->responseProgramNum = response_program_number; 

/* now allocate some memory for the data structures that will actually */
/* carry the request data */

llrs->ARG_PTR = malloc(sizeof(LoopListRequestArgs));

dl = llrs->ARG_PTR->loopList.Loop_List_val;

/* we are using a single descriptor loop at a time, this should always */
/* be the case */

llrs->ARG_PTR->loopList.Loop_List_len = 1;
llrs->ARG_PTR->loopList.Loop_List_val = malloc(sizeof(Descriptor_Loop));

/* now allocate memory and set the size for the ModifyDhctConfiguration */
/* this transaction always has 3 descriptors, the DhctMacAddr_d, the    */
/* DhctState_d, and the PackageAuthorization_d                          */

dl = llrs->ARG_PTR->loopList.Loop_List_val;
dl->Descriptor_Loop_len = 2;
dl->Descriptor_Loop_val = 
    malloc((2 * sizeof(Resource_descriptor_union)));

/* now, populate each descriptor */
/* the order doesn't really matter I'm just doing it in the order I    */
/* always have done */

/* first the mac address descriptor */

dl->Descriptor_Loop_val->type = 
    dhct_mac_addr_type;

strcpy(
    dl->Descriptor_Loop_val[0].Resource_descriptor_union_u.dhctMacAddr.dhctMacAddr,
    dhct_mac_addr
);

/* second the dhct state descriptor */

dl->Descriptor_Loop_val[1].type = 
    dhct_state_type;

dhct_state_ptr =
    &(dl->Descriptor_Loop_val[1].Resource_descriptor_union_u.dhctState);

if(dis_enable)
    dhct_state_ptr->disEnableFlag = DIS_Enabled;
else
    dhct_state_ptr->disEnableFlag = DIS_Disabled;

if(dms_enable)
    dhct_state_ptr->dmsEnableFlag = DMS_Enabled;
else
    dhct_state_ptr->dmsEnableFlag = DMS_Disabled;

if(analog_enable)
    dhct_state_ptr->analogEnableFlag = AEF_Enabled;
else
    dhct_state_ptr->analogEnableFlag = AEF_Disabled;

if(ippv_enable)
    dhct_state_ptr->ippvEnableFlag = IEF_Enabled;
else
    dhct_state_ptr->ippvEnableFlag = IEF_Disabled;

dhct_state_ptr->creditLimit = credit_limit;
dhct_state_ptr->maxIppvEvents = max_ippv_events;

/* we don't currently use the powerkey pin, instead we use an      */
/* application layer pin for purchases and blocking so always turn */   
/* pinEnable off */

dhct_state_ptr->pinEnable = PE_Disabled;
dhct_state_ptr->pin = 0;


if(fast_refresh_enable)
    dhct_state_ptr->fastRefreshFlag = FRF_Enabled;
else
    dhct_state_ptr->fastRefreshFlag = FRF_Disabled;

dhct_state_ptr->locationX = location_x;
dhct_state_ptr->locationY = location_y;

}

关于linux - Linux 和 Solaris 之间的 RPC 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15977540/

相关文章:

java - JAVA中的多线程

linux - 使用 awk 和 sed 根据 awk 中的字段值查找使用文件中的行

bash - 在Solaris的Bash Shell下输入 "env"、 "export"、 "set"命令后输出的命令有什么区别?

java - 如何使用 libcurl 从 C 或 C++ 客户端调用 gwt rpc servlet?

python - 如何测试 SOAP Web 服务的 RPC?

php - 如何知道客户端计算机而不是服务器端的文件路径?

c - 你说它仍然会在后台运行一些东西

python - 如何在无法访问互联网的 Unix 服务器 (Solaris x86) 上安装 pandas 0.24?

c - 正在使用 lseek 扩展保证创建稀疏文件的文件

rpc - 将 RPC 功能添加到 Bernstein 的 Daemontools