我正在尝试使用Sun RPC实现一个小型客户端 - 服务器程序。我希望它具有的一个功能是客户端能够将任何格式的文件上传到服务器。
现在我有这个规范:
struct add_in{
string author<>;
string title<>;
opaque file<>;
};
struct node{
struct node * next;
int id;
string author<>;
string title<>;
opaque paper<>;
};
struct info_out{
string author<>;
string title<>;
};
typedef int add_out;
typedef int remove_in;
typedef struct node* list_out;
typedef int info_in;
typedef int fetch_in;
typedef char* fetch_out;
program FUNCTIONS {
version FUNCTIONS_VERS {
/* Add function. Adds paper to server "database"*/
add_out ADD_PROC(add_in) = 1;
/*Remove function. Removes paper from server "database"*/
void REMOVE_PROC(remove_in) = 2;
/*List function. Displays the papers currently stored by the server*/
list_out LIST_PROC() = 3;
/*Info function. Displays the auther and title of a specific paper*/
info_out INFO_PROC(info_in) = 4;
/*Fetch function. Fetches content of paper from server*/
fetch_out FETCH_PROC(fetch_in) = 5;
} = 1;
} = 0x00000001;
这是我的客户:
#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
char * read_file(char* path){
FILE *file;
char *buffer;
long file_length;
file = fopen(path, "rb");
if(file == NULL){
perror("Unable to open file");
exit(1);
}
printf("file opened\n");
fseek(file,0,SEEK_END);
file_length = ftell(file);
fseek(file,0,SEEK_SET);
buffer=(char *)malloc(file_length+1);
if(buffer == NULL){
perror("Error allocating memory");
exit(1);
}
printf("Memory allocated\n");
fread(buffer, file_length, 1, file);
fclose(file);
printf("File imported, fd closed\n");
return buffer;
}
int main(int argc, char** argv){
CLIENT *cl;
char *buf;
add_in in;
add_out *out;
cl = clnt_create(argv[1], FUNCTIONS, FUNCTIONS_VERS, "tcp");
in.author = argv[3];
in.title = argv[4];
in.file = read_file(argv[5]);
out = add_proc_1(&in, cl);
if(out == NULL){
fprintf(stderr,"Error: %s\n", clnt_sperror(cl,argv[1]));
}else{
printf("%d\n",*out);
}
return 0;
}
问题出在“in.file = read_file(argv [5])”语句中。我收到编译错误说明:
分配给'struct'类型时,不兼容的类型 输入'char *'
所以我的问题是,他需要什么样的指针?
谢谢!
莱纳斯
答案 0 :(得分:2)
opaque file
被翻译成结构:
struct {
uint file_len;
char* file_val;
}