Код C, ошибка RPC RPC: невозможно закодировать аргументы

Я видел этот вопрос, но, похоже, он не применим.

Вот моя функция, которая делает большую часть тяжелой работы в клиентском коде:

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;

c rpc
person Daniel Kobe    schedule 28.04.2016    source источник
comment
Как выглядит ваш XDR? Может ли это быть что-то вроде этого сообщения: stackoverflow.com/q/29710501/4072843   -  person Castaglia    schedule 28.04.2016
comment
@Castaglia добавил файл. Я думаю, что у меня есть правильное количество цифр, хотя.   -  person Daniel Kobe    schedule 28.04.2016
comment
Ваш запрос GET не заполняет поле message.content, а поскольку вы используете malloc(), это поле message.content содержит случайные/ненужные значения. Возможно, для GET нужно явно обнулить message.content.   -  person Castaglia    schedule 28.04.2016
comment
В разделе GET после вызова strcpy(args->action, action) и strcpy(args->id, id) добавьте memset(args->message, 0, sizeof(struct message)).   -  person Castaglia    schedule 28.04.2016
comment
@Castaglia Я получил эту ошибку /usr/include/string.h:65:14: note: expected 'void *' but argument is of type 'struct message', поэтому я использовал &args->action, а затем скомпилировал, но я все еще получаю ту же ошибку   -  person Daniel Kobe    schedule 28.04.2016
comment
Давайте продолжим обсуждение в чате.   -  person Castaglia    schedule 28.04.2016


Ответы (1)


Друг помог мне решить проблему, но не сообщил подробностей о том, почему и как работает исправление. В основном я уменьшил размеры массива символов в своей структуре, и это сработало. Как-то связано с ограничением данных, которые вы можете отправить по 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;
person Daniel Kobe    schedule 28.04.2016