gSoap传输二进制数据
最近使用gSoap传输二进制数据,遇到问题。gSoap不能一次传输二进制数据。所以使用分包传送。
struct xsd_DwgInfo
{
char m_pBuffer[];//分包大小
int m_nReadSize;//
bool m_bEof;//此次是否完全读取数据
}; int ns_GetDwgBinaryInfo(char* chMineID, int nPosition, struct xsd_DwgInfo& dwgInfo);
服务器端代码:
#include <fstream>
using std::ifstream; int ns_GetDwgBinaryInfo(struct soap*, char *chMineID, int nPosition, struct xsd_DwgInfo &dwgInfo)
{//分包传送二进制数据
ifstream file;
file.open("E:\\123.dwg", std::ios::in | std::ios::binary);
if(!file.is_open()) return SOAP_ERR; file.seekg(nPosition);//起始读取位置
file.read(dwgInfo.m_pBuffer, );//读取数据长度
dwgInfo.m_nReadSize = file.gcount();
dwgInfo.m_bEof = file.eof();//当前是否读取完毕
file.close(); return SOAP_OK;
}
客户端代码:
void CCClientWebServiceDemoDlg::OnBnClickedButton4()
{//分包传送
struct soap getInfoSoap;
soap_init(&getInfoSoap);
char* server_addr = "http://127.0.0.1:10000"; xsd_DwgInfo dwgInfo;
int nState = soap_call_ns_GetDwgBinaryInfo(&getInfoSoap, server_addr, "", "", , dwgInfo);
bool bEof(false);
if (getInfoSoap.error)
{
soap_print_fault(&getInfoSoap, stderr);
bEof = true;
}
ofstream file;
if(!bEof)
{
file.open(GetFilePath(_T("Circle.dwg")), std::ios::out | std::ios::binary | std::ios::trunc);
if(file.is_open())
file.write(dwgInfo.m_pBuffer, dwgInfo.m_nReadSize);
}
bEof = dwgInfo.m_bEof;
int nPosition = dwgInfo.m_nReadSize;
soap_end(&getInfoSoap);
soap_done(&getInfoSoap); while(!bEof)
{
soap_call_ns_GetDwgBinaryInfo(&getInfoSoap, server_addr, "", "", nPosition, dwgInfo);
if (getInfoSoap.error)
{
soap_print_fault(&getInfoSoap, stderr);
bEof = true;
}
else
{
if(file.is_open())
file.write(dwgInfo.m_pBuffer, dwgInfo.m_nReadSize);
bEof = dwgInfo.m_bEof;
nPosition += dwgInfo.m_nReadSize;
}
soap_end(&getInfoSoap);
soap_done(&getInfoSoap);
}
if(file.is_open()) file.close();//关闭文件
}
gSoap传输二进制数据的更多相关文章
- atitit.无损传输二进制数据串传输网络
atitit.无损传输二进制数据串传输网络 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1 (推荐) 2 4. utf-8 ...
- Linux企业级项目实践之网络爬虫(16)——使用base64传输二进制数据
用http传输二进制的数据时,需要将二进制做一下转化,例如传输的int类型,将int类型之间转为char以后,丢失掉了长度的信息,如数字123456,本来只有4个字节,但是转化成文本的"12 ...
- http协议传输二进制数据以及对输入流(php://input)和http请求的理解
1.index.php <?php $data=file_get_contents('./a.jpg'); $opts = array('http' => array( 'method' ...
- atitit.二进制数据无损转字符串网络传输
atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1 (推荐) 2 4. utf-8 ...
- 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输
HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...
- 详细解读XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
本文主要参考:MDN 分析并操作 responseXML属性 如果你使用 XMLHttpRequest 来获得一个远程的 XML 文档的内容,responseXML 属性将会是一个由 XML 文档解析 ...
- JavaScript读二进制文件并用ajax传输二进制流
综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...
- C++和python使用struct传输二进制数据结构来实现
网络编程问题往往涉及二进制数据的传输.在C++经常使用的传输是文本字符串和分组结构. 假设该数据可以预先送入连续的内存区域,然后让send函数来获得的第一个地址,这一块连续的内存区就能完成传输数据.文 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
随机推荐
- etymology-I
1)inter-.intra-.intro- 三个前缀inter-,intra-和intro-还是有差别的. inter-表between,如international那是between differ ...
- 图片转base64存储
图片转base64存储 base64.b64encode(r.content) url='http://www.heze.cn/info/themes/heze/Public/tel/?tel=MDU ...
- Error:Execution failed for task ':app:clean'. > Unable to delete directory: ***/app/build/generated/***
第一次从svn拉下来的工程,在clean的时候会出现 Error:Execution failed for task ':app:clean'. > Unable to delete direc ...
- Virtualbox虚拟机安装RouterOS
一,下载 vdi文件https://mikrotik.com/download Cloud Hosted Routerhttps://download.mikrotik.com/routeros/6. ...
- Machine Learning in Action(1) K-近邻
机器学习分两大类,有监督学习(supervised learning)和无监督学习(unsupervised learning).有监督学习又可分两类:分类(classification.)和回归(r ...
- SQL JOIN--初级篇
写在前面的话: 以下是最简单的join原理,为后面的大数据分布式join做概念复习和知识铺垫: 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. JOIN: 如果 ...
- 关于Fragment的onActivityResult 不执行
1.getActivity().startActivityForResult(); 与 fragment.startActivityForActivity(): getActivity().star ...
- linux LVM:物理卷逻辑卷
逻辑卷管理器,当分区不够用的时候,可以新建一个更大的分区再复制进去,但是浪费时间.Lvm可以弹性调整分区大小,可以动态组合分区.分区大小固定了就无法调整, apt-get update & a ...
- IDEA eclipse 控制台日志输出到文件
eclipse IDEA
- ThinkPHP使用方法与心得
ThinkPHP相信PHP程序员对它并不陌生,通过自己的学习在此发表个人看法,也为以后自己查找ThinkPHP方面的知识更加方便. 一.mvc及数据库CURD操作流程: 1.新建数据库:数据库名称:1 ...