gpt4 book ai didi

c - 使用 sun rpc 从服务器发送结构数组到客户端

转载 作者:行者123 更新时间:2023-11-30 17:08:22 24 4
gpt4 key购买 nike

如何在 ansi-c sun-rpc 中正确地将结构从服务器发送到客户端?

在我的test.x IDL文件中,我定义了一个带有字符串和int的结构簇和一个簇类型,它是簇元素的可变长度数组:

struct cluster {
string name<255>;
int debuglevel;
};

typedef cluster clusters<32>;

然后我更改了 rpcgen 生成的 stub ,例如

test_server.c

clusters *
test_1_svc(void *argp, struct svc_req *rqstp)
{

static clusters result;

cluster cl1, cl2;

cl1.name="cl1";
cl1.debuglevel="1";
cl2.name="cl2";
cl2.debuglevel="2";

cluster clist[2];

clist[0]=cl1;
clist[1]=cl2;

result.clusters_len = 2;
result.clusters_val = &clist;

/*
* insert server code here
*/

return(&result);
}

test_client.c

test_prog_1( char* host )
{
CLIENT *clnt;
clusters *result_1;
char* test_1_arg;
clnt = clnt_create(host, test_PROG, test_VERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
result_1 = test_1((void*)&test_1_arg, clnt);
if (result_1 == NULL) {
clusters* rec_cls = malloc(2*sizeof(struct cluster));
if(xdr_clusters(&result_1, rec_cls)){
printf("got xdr_clusters");
}
clnt_perror(clnt, "call failed:");
}
clnt_destroy( clnt );
}

两者都可以编译,但服务器经常在客户端运行一两个请求后出现段错误,并且在客户端,xdr_clusters 函数永远不会返回 true。这似乎是某种内存管理不善,我也不确定我是否正确处理服务器端的序列化。

我刚刚用适当的值填充了 result.clusters_len 和 result.clusters_val,就像它们在 test.h 中定义的那样(由 rpcgen):

typedef struct {
u_int clusters_len;
cluster *clusters_val;
} clusters;

我是否必须在服务器端使用 xdr_clusters 才能正确序列化结果?

谢谢

最佳答案

好吧,我发现了我的错误,让我们总结一下:

  • 知道如何正确初始化 int (当然不带引号...)
  • 忘记 clist 的废话,直接 malloc 结果结构的内部指针
  • 阅读该死的编译器警告:当它告诉您,有隐式声明的函数并且您不想要隐式声明时,那么可能缺少某些内容,在我的情况下,我需要包含 stdlib.h 和 stdio.h获取服务器和客户端 stub 的 malloc、printf 和 exit 函数。
  • 在客户端:除了在结果为 NULL 时抛出错误之外,我们为什么还要做任何事情?请参阅下面的新客户端代码来检查正确的结果打印

test_server.c

    test_1_svc(void *argp, struct svc_req *rqstp){

static clusters result;

cluster cl1, cl2;

cl1.name="cl1";
cl1.debuglevel=1;
cl2.name="cl2";
cl2.debuglevel=2;

result.clusters_len = 2;
result.clusters_val = malloc(2*sizeof(struct cluster));

result.clusters_val[0]=cl1;
result.clusters_val[1]=cl2;

return(&result);
}

test_client.c

test_prog_1( char* host )
{
CLIENT *clnt;
clusters *result_1;
char* test_1_arg;
clnt = clnt_create(host, test_PROG, test_VERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
result_1 = test_1((void*)&test_1_arg, clnt);
if (result_1 == NULL) {
clnt_perror(clnt, "call failed:");
}else{
printf("I got %d cluster structs in an array\n",result_1->clusters_len);
int j;
for(j=0;j<result_1->clusters_len;j++){
printf("cluster #%d: %s@runlevel %d\n",j,result_1->clusters_val[j].name,result_1->clusters_val[j].debuglevel);
}
}
clnt_destroy( clnt );
}

因此,我们在客户端打印出一些不错的值当然,服务器端不再出现段错误:

lars$ ./test_client localhost
I got 2 cluster structs in an array
cluster #0: cl1@runlevel 1
cluster #1: cl2@runlevel 2

关于c - 使用 sun rpc 从服务器发送结构数组到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33703554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com