gsoap简单应用(MTOM附件实例:Server端)

首先编写头文件,我用是的gsoap里面带的一个头文件(偷懒了)

头文件名是mtom-stream-test.h,这里需要三个文件soap12.h,xop.h,xmime4.h,可以在import文件夹下找到,复制到win32文件夹下即可

 

#import "soap12.h"
#import "xop.h"
#import "xmime4.h"

//gsoap m service name:  mtom_stream_test
//gsoap m service namespace: http://www.genivia.com/wsdl/mtom_stream_test.wsdl

//gsoap x schema namespace: http://www.genivia.com/schemas/mtom_stream_test.xsd
//gsoap x schema elementForm: qualified

//gsoap x schema type-documentation: Data holds a MIME attachment
struct x__Data
{ _xop__Include xop__Include;
@char *xmime4__contentType;
};

//gsoap x schema type-documentation: DataSet holds a set of MIME attachments
struct x__DataSet
{ int __size;
  struct x__Data *item;
};

//gsoap x schema type-documentation: Keys holds a set of strings to access the data collection at the server side
struct x__Keys
{ int __size;
  char **key;
};

//gsoap m service method-mime-type: PutData */*
//gsoap m service method-documentation: PutData stores a data set at the server side and returns a set of unique keys to access that data
int m__PutData(
  struct x__DataSet *x__data,
  struct m__PutDataResponse
  { struct x__Keys x__keys;
  }*
);

//gsoap m service method-mime-type: GetData */*
//gsoap m service method-documentation: GetData gets a set of data items from the server given a set of keys
int m__GetData(
  struct x__Keys *x__keys,
  struct m__GetDataResponse
  { struct x__DataSet x__data;
  }*
);

 

 

下面还是把生成的文件添加到一个空工程,添加一个空的cpp写主程序(比较多,不过都挺简单)

 

#include "soapH.h"
#include "mtom_stream_test.nsmap"
#include <sys/stat.h>

 

//
//打开文件                                                              //
//
int open_data(struct soap *soap, const char *file, struct x__Data *data);

//
//用与发送文件时读取文件                                                //
//
void *mime_read_open(struct soap*, void*, const char*, const char*, const char*);
void mime_read_close(struct soap*, void*);
size_t mime_read(struct soap*, void*, char*, size_t);

//
//用与接收文件时存储文件                                                //
//
void *mime_server_write_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding);
void mime_server_write_close(struct soap *soap, void *handle);
int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len);

//
//用来得到判断文件的type                                                //
//
char *file_type(const char *file);


int main()
{


 struct soap soap;
 soap_init1(&soap,SOAP_ENC_MTOM);
 soap.fmimereadopen = mime_read_open;
 soap.fmimereadclose = mime_read_close;
 soap.fmimeread = mime_read;
 soap.fmimewriteopen = mime_server_write_open;
 soap.fmimewriteclose = mime_server_write_close;
 soap.fmimewrite = mime_server_write;

 int port = 0;
 int sock;

 printf("请输入服务器端口:");
 scanf_s("%d",&port);

 if (!soap_valid_socket(soap_bind(&soap,NULL,port,100)))     //第三个参数是端口
 {


  soap_print_fault(&soap, stderr);

 } 
 else
 {
  

  fprintf(stderr,"启动服务器成功,端口为:%d\n",port);

  for (;;)
  {


   sock = soap_accept(&soap);                         //接收
   if (!soap_valid_socket(sock))
   {


    soap_print_fault(&soap,stderr);


   }
   else
   {


    fprintf(stderr, "接受 socket=%d 的连接,连接的 IP 为 %d.%d.%d.%d... \n", sock, (int)(soap.ip>>24)&0xFF, (int)(soap.ip>>16)&0xFF, (int)(soap.ip>>8)&0xFF, (int)soap.ip&0xFF);
    if (soap_serve(&soap))
    {


     soap_print_fault(&soap,stderr);


    }


    fprintf(stderr,"完成\n");
    soap_destroy(&soap);
    soap_end(&soap);
   }


  }
  soap_destroy(&soap);
  soap_end(&soap);
  soap_done(&soap);
 

}
 

return 0;

}

//
//服务器接收文件                                                        //
//
int m__PutData(struct soap *soap, struct x__DataSet *data, struct m__PutDataResponse *response)
{


 if ((soap->omode & SOAP_IO) == SOAP_IO_STORE)
  soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER;
 if (!data)
  return soap_sender_fault(soap, "没有文件", NULL);
 
  return SOAP_OK;


}

//
//服务器发送文件                                                        //
//
int m__GetData(struct soap *soap, struct x__Keys *keys, struct m__GetDataResponse *response)
{


 if ((soap->omode & SOAP_IO) == SOAP_IO_STORE)
  soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_BUFFER;
 if (!keys)
 {
  return soap_sender_fault(soap,"没有接收到文件名\n",NULL);
 }
 response->x__data.__size = keys->__size;
 response->x__data.item = new x__Data();
 open_data(soap,keys->key[0],response->x__data.item);
 
 return SOAP_OK;


}

int open_data(struct soap *soap, const char *file, struct x__Data *data)
{


 struct stat sb;
 FILE *fd = NULL;
 int size;
 soap_default_x__Data(soap,data);

 if (fopen_s(&fd,file,"rb"))
 {
        fprintf(stderr,"不能打开文件%s\n",file);
        return soap->error = SOAP_EOF;
 }

 if (!fstat(_fileno(fd),&sb) && sb.st_size > 0)
 {
        size = sb.st_size;
 } 
 else
 {
        size = 0;
 }

 data->xop__Include.__ptr = (unsigned char *)fd;
 data->xop__Include.__size = size;
 data->xmime4__contentType = file_type(file);
 data->xop__Include.type = data->xmime4__contentType;
 data->xop__Include.options = NULL;

 return SOAP_OK;


}

void *mime_read_open(struct soap *soap, void *handle, const char *id, const char *type, const char *description)

     FILE *fd = (FILE*)handle;
     fprintf(stderr,"打开需要发送的附件,id=%s,type=%s\n",id,type);
     return (void*)fd;
}

size_t mime_read(struct soap *soap, void *handle, char *buf, size_t len)

      return fread(buf, 1, len, (FILE*)handle);
}

void mime_read_close(struct soap *soap, void *handle)

    fprintf(stderr, "关闭需要发送的附件\n");
    fclose((FILE*)handle);
}

void *mime_server_write_open(struct soap *soap, void *unused_handle, const char *id, const char *type, const char *description, enum soap_mime_encoding encoding)
{


 FILE *fd;
 const char *file;
 const char *dir = ".";
 file = _tempnam(dir,"data");
 if (fopen_s(&fd,file,"wb"))
 {
  soap->error = soap_sender_fault(soap, "无法打开文件", file);
  soap->errnum = errno; /* get reason */
  return NULL;
 }
 fprintf(stderr, "保存文件 %s type=%s\n", file , type?type:"");
 
 return (void *)fd;


}

void mime_server_write_close(struct soap *soap, void *handle)

           fclose((FILE *)handle);
}

int mime_server_write(struct soap *soap, void *handle, const char *buf, size_t len)
{


 FILE *fd = (FILE *)handle;
 while (len)
 {


  size_t nwritten = fwrite(buf, 1, len, fd);
  if (!nwritten)
  {
   soap->errnum = errno;
   return SOAP_EOF;
  }
  len -= nwritten;
  buf += nwritten;


 }
 
    return SOAP_OK;


}


char *file_type(const char *file)
{

 int n = strlen(file);
if (n > 4 && (!strcmp(file + n - 4, ".xml")
     || !strcmp(file + n - 4, ".xsd")
     || !strcmp(file + n - 5, ".wsdl")))
  return "text/xml";
if (n > 4 && !strcmp(file + n - 4, ".jpg"))
  return "image/jpg";
return "*/*";


}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值