0

クライアントから構造体 (いくつかの文字列を含む) をサーバーに転送する 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);
}

サーバーが文字列をリストに正しく追加していないようです。list-id (リストの先頭) を出力するときは毎回 '1' を出力しますが、現在の呼び出しでサーバー関数に与えられた文字列値を出力するだけです (リストの最初の項目)。

これがどこでうまくいかないか知っている人はいますか?

4

1 に答える 1

0

私はここで推測していますが、RPC 実装は使用されている文字列バッファーを再利用in->authorするため、常に同じバッファーを指している可能性がありますか?

in->authorすべてのリクエストのアドレスを出力することで、簡単に見つけることができます。

于 2013-10-10T10:03:27.160 に答える