gpt4 book ai didi

c - 如何在 onc-rpc 中将字符串 (char*) 从服务器发送到客户端

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:40 26 4
gpt4 key购买 nike

我希望有人能帮助我。我正在制作一个程序,将一个长变量从客户端发送到服务器,最后一个必须用字符串响应。我想指出我正在使用 onc-rpc 框架(如果我没记错的话,是 sunRPC)。

这是我当前的标题 => msg.x

//msg.x
program MESSAGEPROG
{
version MESSAGEVERS
{
string FIBCALC(long) = 1;
} = 1;
} = 0x20000001;

我的服务器 stub 必须实现这个功能。我不会放所有的代码,因为这是一个家庭作业。

我的服务器 stub => server.c

#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlb.h>
#include "msg.h"

char ** fibcalc_1_svc(whatToUse, dummy)
long *whatToUse;
struct svc_req *dummy;
{
char whatToSend;

whatToSend = (char **)malloc(sizeof(char*));
*whatToSend = (char *)malloc(sizeof(char) * STRING_SIZE);

//............

return whatToSend;
}

不用说,其余的实现在没有 rpc 的情况下也能正常工作。如果我打印它在非 rpc C 文件上工作的字符串。

#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlb.h>
#include "msg.h"

int main(int argc, char *argv[])
{
CLIENT *cl;
char **result;
long *whatToSend, *test;
FILE *fout, *fin;


whatToSend = (long *)malloc(sizeof(long));
result = (char **)malloc(sizeof(char*));
*result = (char *)malloc(sizeof(char) * STRING_SIZE);

if(argc != 3)
{
/* if arguments are not passed corectly
* we print the following message and close with exit error
*/
fprintf(stderr, "usage : ./%s [server ip] [fileIn]\n", argv[0]);
exit(1);
}

cl = clnt_create(argv[1],
MESSAGEPROG,
MESSAGEVERS,
"tcp");
if(cl == NULL)
{
/* if no connection to server
* we print the following message and close with exit error
*/
clnt_pcreateerror(argv[1]);
exit(1);
}


/* Sanity checks for file handle
*/
fin = fopen(argv[2],"r");
if (fin == NULL)
{
fprintf(stderr, "Input handle could not be opened!\n");
exit(1);
}

fout = fopen("out.txt", "w");
if (fout == NULL)
{
fprintf(stderr, "Output handle could not be opened!\n");
exit(1);
}


while(fscanf(fin, "%ld", whatToSend) != EOF)
{
memset(*result, 0, STRING_SIZE);



result = fibcalc_1(whatToSend, cl);

if(result == NULL)
{
/* Server did not respond
*/
clnt_pcreateerror("localhost");
exit(1);
}

printf("%s\n", *result);
}

/* Sanity checks for closing the handles
*/
if(fclose(fin))
{
fprintf(stderr, "Input handle could not be closed!!\n");
exit(1);
}

if(fclose(fout))
{
fprintf(stderr, "Output handle could not be closed!!\n");
exit(1);
}

/* Free allocated memory
*/
free(whatToSend);
free(*result);
free(result);

exit(0);
}

当我收到服务器消息时出现段错误。当我 gdb 时,并在

处执行客户端程序
result = fibcalc_1(whatToSend, cl); 

我知道结果地址是0x00

当我将结果类型更改为 int 或 long 或 w/e 时,结果很好地显示并且程序运行。

我还想指出结果是 char** 类型,因为在 onc-rpc 中字符串是 char * 类型,我开始意识到服务器函数必须返回的任何变量都是返回值的地址。

我希望我能充分解释我的问题。我的第一个想法是,在服务器函数中,char whatToSend[20] 应该是我应该分配的 char * 类型,但我该如何解除分配呢?

提前致谢。

最佳答案

我的问题是,当我尝试从服务器 stub 函数发送结果时,我没有意识到我发送的内容必须保存在 .data(静态声明)或堆(malloc)上。我的决心是在服务器 stub 中更改以下内容。

char ** fibcalc_1_svc(whatToUse, dummy)
long *whatToUse;
struct svc_req *dummy;
{
char whatToSend;

whatToSend = (char **)malloc(sizeof(char*));
*whatToSend = (char *)malloc(sizeof(char) * STRING_SIZE);

//............

return whatToSend;
}

在客户端中,我试图在函数调用后释放结果。虽然我有内存泄漏,但它现在可以工作了。感谢@chux 的帮助

关于c - 如何在 onc-rpc 中将字符串 (char*) 从服务器发送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26621169/

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