C 代码,RPC 错误“RPC:无法编码参数”

Posted

技术标签:

【中文标题】C 代码,RPC 错误“RPC:无法编码参数”【英文标题】:C Code, RPC Error "RPC: Can't encode arguments" 【发布时间】:2016-04-28 03:25:25 【问题描述】:

我看到了这个question,但它似乎不适用。

这是我在客户端代码中完成大部分繁重工作的函数:

void
database_1(char *host, char *action, char *message)

    printf("Action: %s\n", action);
    printf("Message: %s\n", message);
    CLIENT *clnt;
    rpc_args  *result_1;
    //struct rpc_args  action_1_arg;

    //rpc arguments struct to pass to server
    struct rpc_args *args = malloc(sizeof(struct rpc_args));

    char *id = generate_id();
    if (strcmp(action, "GET") == 0) 
        printf("Client: GET request\n");
        strcpy(args->action, action);
        strcpy(args->id, id);
     else if(strcmp(action, "PUT") == 0) 
        printf("Client: PUT request\n");
        strcpy(args->action, action);
        strcpy(args->id, id);
        strcpy(args->message.content, message);
    

#ifndef DEBUG
    clnt = clnt_create (host, DATABASE, ASSIGNMENT_7, "udp");
    if (clnt == NULL) 
        clnt_pcreateerror (host);
        exit (1);
    
#endif  /* DEBUG */

    result_1 = action_1(args, clnt);
    if (result_1 == (rpc_args *) NULL) 
        clnt_perror (clnt, "call failed");
    
    free(args);
#ifndef DEBUG
    clnt_destroy (clnt);
#endif   /* DEBUG */

这是我的输出:

./database_client eecslinab3.case.edu GET 
running client, main
Action: GET
Message: (null)
hostname is eecslinab3
The process id is 24697
The unique id is eecslinab324697
Client: GET request
call failed: RPC: Can't encode arguments

数据库.x

struct message 
    char content[2000];
;

struct rpc_args 
    char action[20];
    char id[1024];
    struct message message;
;

program DATABASE 
    version ASSIGNMENT_7 
        rpc_args ACTION(struct rpc_args) = 1;
     = 1;
 = 0x20fff100;

【问题讨论】:

您的 XDR 是什么样的?可以像这样的帖子:***.com/q/29710501/4072843 @Castaglia 添加了文件。我想我的位数是正确的。 您的GET 请求未填充message.content 字段,并且由于您使用malloc(),因此message.content 字段具有随机/垃圾值。也许,对于GETmessage.content 需要明确归零。 GET部分,在调用strcpy(args->action, action)strcpy(args->id, id)之后,添加memset(args->message, 0, sizeof(struct message)) @Castaglia 我收到了这个错误/usr/include/string.h:65:14: note: expected 'void *' but argument is of type 'struct message' 所以我使用了&args->action 然后编译了它,但我仍然遇到同样的错误 【参考方案1】:

一位朋友帮助我解决了这个问题,但没有详细说明修复的原因或方式。基本上我减少了结构中的 char 数组大小并且它起作用了。与您可以通过 UDP 发送的数据的限制有关。

struct rpc_args 
    char action[20];
    char id[80];
    char message[80];
;

program DATABASE 
    version ASSIGNMENT_7 
        rpc_args ACTION(struct rpc_args) = 1;
     = 1;
 = 0x20fff100;

【讨论】:

以上是关于C 代码,RPC 错误“RPC:无法编码参数”的主要内容,如果未能解决你的问题,请参考以下文章

在 RPC 代码中获取 memcheck 错误

gwt rpc 中的 http 错误代码

windows无法启动windows Audio 错误代码:1722RPC服务器不可用

如何处理 XML-RPC 中的错误响应?

C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC

git push 错误:RPC 失败;结果 = 56,HTTP 代码 = 0 [关闭]