在 RPCGen 中将字符指针从客户端传递到服务器

Posted

技术标签:

【中文标题】在 RPCGen 中将字符指针从客户端传递到服务器【英文标题】:Passing character pointers from client to server in RPCGen 【发布时间】:2015-03-03 01:15:27 【问题描述】:

我正在尝试将字符指针从 rpc 客户端发送到 rpcgen 中的服务器,下面是服务器和客户端程序

RPC 生成的 RPC 程序

struct clientinput 
    char * optype;
    char * word;
;

program DICTIONARY_PROG 
    version DICTIONARY_VERS 
        int USEDICTIONARY(clientinput) = 1;
     = 1;
 = 0x23451113;

RPC 服务器

    #include "dictionary.h"

    int *
    usedictionary_1_svc(clientinput *argp, struct svc_req *rqstp)
    
        static int  result;
        char *optype = (char*)malloc (10);
        char *word = (char*)malloc (10);

        char *a = argp->optype;
        char *b = argp->word;

        printf("Optype is %s\n", a);
        printf("Word is %s\n", b);

        printf("The optype is %s\n", strcpy(optype, argp->optype));
        printf("The word is %s\n", strcpy(word, argp->word));
        /*
         * insert server code here
         */

        return &result;
    

RPC 客户端

#include "dictionary.h"


void
dictionary_prog_1(char *host, char *optype, char *word)

    CLIENT *clnt;
    int  *result_1;
    clientinput  usedictionary_1_arg;

    //strcpy(usedictionary_1_arg.optype, optype);
    //strcpy(usedictionary_1_arg.word, word);

    usedictionary_1_arg.optype = optype;
    usedictionary_1_arg.word = word;

    printf("Optype input is %s\n",usedictionary_1_arg.optype);
    printf("Word input is %s \n",usedictionary_1_arg.word);

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

    result_1 = usedictionary_1(&usedictionary_1_arg, clnt);
    if (result_1 == (int *) NULL) 
        clnt_perror (clnt, "call failed");
    
#ifndef DEBUG
    clnt_destroy (clnt);
#endif   /* DEBUG */



int
main (int argc, char *argv[])

    char *host, *optype, *word;

    if (argc < 2) 
        printf ("usage: %s server_host\n", argv[0]);
        exit (1);
    
    host = argv[1];
    optype = argv[2];
    word = argv[3];

    dictionary_prog_1 (host,optype,word);
exit (0);

这是服务器端的输出

Optyep is a
Word is e
The optype is a
The word is e

我在这里遇到的问题是,只有我从服务器传递到客户端的字符指针的第一个字符被打印出来。我尝试了使用字符指针的可能组合,但找不到原因。那么有人可以帮我找出原因吗?

【问题讨论】:

【参考方案1】:

通过查看文档,RPCGen 需要一些帮助来区分单个字符参数和实际的字符数组,因为所有参数都作为指针传递。要让它知道您想要一个字符数组,也就是字符串,您需要在结构声明中使用 string 关键字,如下所示:

struct clientinput 
    string optype<>;
    string word<>;
;

这个answer 也解释了它,这个blog post 有一个与你想要完成的类似的例子。

【讨论】:

同意。那么我如何在我的 c 程序中使用来检索值呢?我的意思是它应该被处理并转换为 char *。我对 c 比较陌生,这就是为什么我听起来很菜的原因 你不需要投射。 string 关键字将使用char* 作为成员类型生成代码,但用于 rpc 调用的序列化/反序列化代码会将这些代码视为以空字符结尾的字符串而不是单个字符。我很确定客户端的 print 正在打印整个字符串,但编组发送的是单个字符。 在我的回答中添加了一个链接,向您展示一个与您的用例类似的工作示例。

以上是关于在 RPCGen 中将字符指针从客户端传递到服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 rpcgen 从远程服务器返回字符串

如何在 UINavigationController 中将指针从 View 3 传递回 View 2 到 View 1?

如何在 GWT RPC 中将异常从服务器传递到客户端

如何使用express [重复]在nodejs中将对象从服务器端传递到客户端

设置 JWT - 在标头中将令牌从服务器传递到客户端,但无法解析客户端中的标头

如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器