2012-10-12 90 views
1

我正在嘗試使用Sun RPC實現一個小型客戶機 - 服務器程序。我希望它的一個功能是讓客戶端能夠將任何格式的文件上傳到服務器。通過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])」 的聲明。我得到一個編譯錯誤,指出:

不兼容的類型分配給鍵入從 型'結構「的char *」

所以我的問題是,是否他需要什麼樣的指針的時候? ?

謝謝!

萊納斯

回答

2

opaque file被翻譯成一個結構:

struct { 
    uint file_len; 
    char* file_val; 
} 
相關問題