首先编写头文件,我用是的gsoap里面带的一个头文件(偷懒了)
头文件名是mtom-stream-test.h,这里需要三个文件soap12.h,xop.h,xmime4.h,可以在imp
#imp
#imp
#imp
//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: Da
struct x__Da
{ _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__Da
};
//gsoap x schema type-documentation: Keys holds a set of strings to access the da
struct x__Keys
{ int __size;
char **key;
};
//gsoap m service method-mime-type: PutData */*
//gsoap m service method-documentation: PutData stores a da
int m__PutData(
struct x__DataSet *x__da
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 da
int m__GetData(
struct x__Keys *x__keys,
struct m__GetDataResponse
{ struct x__DataSet x__da
}*
);
下面还是把生成的文件添加到一个空工程,添加一个空的cpp写主程序(比较多,不过都挺简单)
#include "soapH.h"
#include "mtom_stream_test.nsmap"
#include <sys/stat.h>
//
//打开文件 //
//
int open_da
//
//用与发送文件时读取文件 //
//
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 *da
{
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__Da ta();
open_data(soap,keys->key[0],response->x__da ta.item);
return SOAP_OK;
}
int open_da
{
struct stat sb;
FILE *fd = NULL;
int size;
soap_default_x__Data(soap,da ta); 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;
}da
ta->xop__Include.__ptr = (unsigned char *)fd;
data->xop__Include.__size = size;
data->xmime4__contentType = file_type(file);
data->xop__Include.type = da ta->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 "*/*";
}