1

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>

だから私の質問は、彼はどのようなポインター必要ですか?

ありがとう!

ライナス

4

1 に答える 1

2

opaque file構造体に変換されます:

struct {
    uint file_len;
    char* file_val;
}
于 2012-10-12T15:34:21.907 に答える