SunRPCを使用して小さなクライアントサーバープログラムを実装しようとしています。私が望んでいる機能の1つは、クライアントが任意の形式のファイルをサーバーにアップロードできるようにすることです。
今私はこの仕様を持っています:
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])」ステートメントにあります。次のようなコンパイラエラーが発生します。
タイプ'char*'からタイプ'struct'に割り当てる場合の互換性のないタイプ</p>
だから私の質問は、彼はどのようなポインターが必要ですか?
ありがとう!
ライナス