通过 Sun RPC 发送二进制文件

Posted

技术标签:

【中文标题】通过 Sun RPC 发送二进制文件【英文标题】:Sending binary files over Sun RPC 【发布时间】:2012-10-12 15:01:33 【问题描述】:

我正在尝试使用 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])”语句。我收到一个编译器错误说明:

分配给类型‘struct’时不兼容的类型 输入‘char *’

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

谢谢!

莱纳斯

【问题讨论】:

【参考方案1】:

opaque file 被翻译成一个结构体:

struct 
    uint file_len;
    char* file_val;

【讨论】:

以上是关于通过 Sun RPC 发送二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

从服务器向客户端发送带有 sun rpc 的结构数组

从客户端发送结构并使用 SUN-RPC 以链表的形式保存到服务器

通过 Google Protobuf 发送二进制文件数据

如何使用 Rails 通过 Web Sockets 发送二进制文件

RPC 如何传输大二进制数据?

RPC in Golang