Отправить структуру с клиента и сохранить на сервер в связанном списке с помощью SUN-RPC

Я хочу написать серверную/клиентскую программу, используя RPC, которая передает структуру от клиента (содержащую некоторые строки) на сервер. Эта структура должна быть сохранена на сервере с использованием связанного списка. На данный момент у меня есть следующий код:

.x-файл:

struct paper_node
{
    long id;
    string author<>;
    struct paper_node *next;
};

struct add_in
{
    string author<>;
};

typedef struct paper_node *list_node;

сервер

add_out *add_proc_1_svc(add_in *in, struct svc_req *rqstp)
{
    static add_out out;
    static long id = 1;
    static paper_node *list = NULL;
    //paper_node *p, *q;
    paper_node *pointer, *new_paper;

    new_paper = (paper_node *) malloc(sizeof(paper_node));
    new_paper->id = id;
    new_paper->author = in->author;
    new_paper->next = NULL;

    if (list == NULL)
    {
        list = new_paper;
    }
    else
    {
        for (pointer = list; pointer->next != NULL; pointer = pointer->next);
        pointer->next = new_paper;
    }

    printf("%ld - %s\n", list->id, (char *)list->author);

    out = id;       
    id += 1;

    return(&out);
}

клиент

void handle_new_paper(char **argv, CLIENT *cl)
{   
    add_in in;
    add_out *out;

    buffer = read_new_paper(argv);

    in.author = argv[3];

    out = add_proc_1(&in, cl);
    if (out == NULL) { printf("Error: %s\n", clnt_sperror(cl, argv[1])); }
    else
    {
        printf("%ld\n", *out);
    }
    free(buffer);
}

Сервер, похоже, неправильно добавляет строки в список. При печати идентификатора списка (заголовок списка) он каждый раз печатает «1», но он просто печатает строковые значения, которые были переданы серверной функции при текущем вызове (а не строковые значения первый пункт в списке).

Кто-нибудь знает, где это идет не так?


person Froodooo    schedule 10.10.2013    source источник
comment
Я думаю, вам также нужно логическое поле hasNext в файле paper_node.   -  person kofemann    schedule 11.10.2013


Ответы (1)


Я просто предполагаю, но может быть реализация RPC повторно использует используемый строковый буфер, поэтому in->author всегда указывает на один и тот же буфер?

Вы можете легко узнать это, распечатав адрес in->author для каждого запроса.

person Some programmer dude    schedule 10.10.2013
comment
Это действительно была вещь повторного использования. Теперь я сначала выделяю память для всех строк, а затем использую функцию strcpy() для передачи входящих данных в новый узел. Это работает нормально. Спасибо! - person Froodooo; 11.10.2013