我正在尝试使用 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 openedn");
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 allocatedn");
fread(buffer, file_length, 1, file);
fclose(file);
printf("File imported, fd closedn");
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: %sn", clnt_sperror(cl,argv[1]));
}else{
printf("%dn",*out);
}
return 0;
}
问题在于"in.file = read_file(argv[5])"语句。我收到一个编译器错误,指出:
从中分配给类型"struct"时不兼容的类型 键入"字符 *"
所以我的问题是,他需要什么样的指针?
谢谢!
莱纳斯
opaque file
被翻译成结构体:
struct {
uint file_len;
char* file_val;
}