• gSoap传输二进制数据


    最近使用gSoap传输二进制数据,遇到问题。gSoap不能一次传输二进制数据。所以使用分包传送。

    1 struct xsd_DwgInfo
    2 {
    3     char m_pBuffer[1024];//分包大小
    4     int m_nReadSize;//
    5     bool m_bEof;//此次是否完全读取数据
    6 };
    7 
    8 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, 1024);//读取数据长度
        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, "", "1", 0, 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, "", "1", 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();//关闭文件
    }
  • 相关阅读:
    SQLServer数据库优化常用语句
    雷军:用互联网思维改造传统产业
    互联网公司该向东莞学什么?
    企业管理:中层领导必看:什么叫工作到位?
    Web页面工作流设计器
    雷军:用互联网思维改造传统产业
    生成html页面客户端随机数和验证码
    IIS应用程序池频繁停止,任务管理器发现有多个w3wp.exe进程
    检测SqlServer服务器性能
    利用任务计划自动删除指定日期文件
  • 原文地址:https://www.cnblogs.com/lpxblog/p/4791798.html
Copyright © 2020-2023  润新知