1

我正在尝试使用 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 *'分配给类型'struct'时不兼容的类型</p>

所以我的问题是,他需要什么样的指针

谢谢!

莱纳斯

4

1 回答 1

2

opaque file被翻译成一个结构:

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