我希望有人可以帮助我。我正在制作一个程序,将一个长变量从客户端发送到服务器,最后一个必须用字符串响应。我想指出我正在使用onc-rpc框架(sunRPC如果我没有误会)。
这是我当前的标头=> msg.x
//msg.x
program MESSAGEPROG
{
version MESSAGEVERS
{
string FIBCALC(long) = 1;
} = 1;
} = 0x20000001;
我的服务器存根必须实现此功能。我不会把所有的代码都放在一边,因为它是一个家庭作业。
我的服务器存根=> 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。如果我printf字符串它在非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);
}
当我收到服务器消息时,我得到seg故障。当我gdb,并在
步骤客户端程序result = fibcalc_1(whatToSend, cl);
我得到结果地址是0x00
当我更改结果类型时,让我们说一个int或long或w / e,结果很好,并且程序可以运行。
我还想指出结果是char **类型,因为string在onc-rpc中是char *类型,我开始意识到服务器函数必须返回的任何变量都是返回值的地址。
我希望我能很好地解释我的问题。我的第一个想法是,在服务器函数中,char whatToSend [20]应该是我应该分配的char *类型,但是我如何解除分配呢?
提前谢谢你。
答案 0 :(得分:1)
我的问题是,当我试图从服务器存根函数发送结果时,我没有意识到我发送的内容必须保存在.data(静态声明)或堆(malloc)上。我的决心是在服务器存根中更改以下内容。
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的帮助