VC++ gSOAP 谁做成功的阿......找了好多资料都不成功..谢谢各位大侠了

解决方案 »

  1.   

    http://blog.csdn.net/cwisdomroof/archive/2010/07/12/5729446.aspx
      

  2.   

    简单应用很简单,.h#pragma once#include "soapH.h"
    #include <string>
    #include <vector>
    #include <deque>
    #include <map>
    #include "ThreadBase.h"
    #include "ThreadMutex.h"
    #include "GsoapServer.h"using namespace std;typedef struct __Map_DataInfo
    {
    HANDLE hEvent;
    string strData;
    }Map_DataInfo;
    //定义队列阀值
    #define __Socket_Deque_Max_Length 1000class CGsoapThread;
    class CServer : public ThreadBase
    {
    public:
    static CServer* Instance(void);
    ~CServer(void); int StartServer(int nPort);
    int SetListenThreadNum(int nNum);
    int StopServer();
    int GsoapOnAckData(string strData, int nPackageId);
    int AddSessionId(GsoapSessionInfo sessioninfo);
    int RemoveSessionId(int nSessionId);
    void SetWaitDataTimeOut(int nDataWaitTimeOut);
    void SetGsoapServer(CGsoapServer* pGsoapServer);
    deque<SOAP_SOCKET> m_dequeSoapSocket;//请求队列
    map<int, Map_DataInfo> m_mapDataInfo; //数据映射map
    map<int, GsoapSessionInfo> m_mapSession;//会话map
    map<SOAP_SOCKET, int > m_mapSessionId;//根据soap_socket 查找SessionId
    CGsoapServer* m_pGsoapServer;
    struct soap m_soapServer;
    AX_Mutex m_mtxQueue;
    int m_nDataWaitTimeOut;//数据处理间隔
    private:
    CServer();
    int run();
    int Listen(int nPort);

    static CServer* _this;
    bool m_bRunning;
    int m_nThreadNum;
    vector<CGsoapThread*> m_vctThread;
    };.cpp
    #include "Server.h"
    #include "VQDSInterfaceHttpBinding.h"
    #include "GsoapThread.h"
    #include "SingleAXLock.h"
    #include "Struct.h"
    int __ns1__sendMessage(struct soap*, _ns1__sendMessage *ns1__sendMessage, _ns1__sendMessageResponse *ns1__sendMessageResponse)
    {
    //CServer* pServer = CServer::Instance();
    //GsoapData data;
    //struct soap* soap = ns1__sendMessage->soap;
    //string* str = (string*)soap_malloc(soap,__GsoapBuffer_Max_Length);
    //
    //data.nCmdCode = ns1__sendMessage->in0;
    //data.nPara1 = ns1__sendMessage->in1;
    //data.nPara2 = ns1__sendMessage->in2;
    //data.strPara1 = *ns1__sendMessage->in3;
    //data.strPara2 = *ns1__sendMessage->in4;
    ////数据回调
    //int nPacgeId = pServer->m_pGsoapServer->GsoapOnData(data); ////加入map
    //Map_DataInfo map_data;
    //HANDLE hEvent = CreateEvent(NULL, true, false , NULL);
    //map_data.hEvent = hEvent;
    //pServer->m_mapDataInfo[nPacgeId] = map_data;
    //DWORD dwRet = WaitForSingleObject(hEvent, pServer->m_nDataWaitTimeOut);
    //
    //string strRet;
    //map<int, Map_DataInfo>::iterator it = pServer->m_mapDataInfo.find(nPacgeId);
    //switch(dwRet)
    //{
    // case WAIT_OBJECT_0:
    // {
    // strRet = it->second.strData;
    //
    // }
    // break;
    // default:
    // {
    // //超时删除
    // pServer->m_mapDataInfo.erase(it);
    // return 0;
    // }
    //}
    //
    //memset(str,0,__GsoapBuffer_Max_Length);
    //if (strRet.length() > __GsoapBuffer_Max_Length)
    //{
    // return 0;
    //}
    //memcpy((char*)str->c_str(),(char*)strRet.c_str(),strRet.length());
    //ns1__sendMessageResponse->out = str; return 0;
    }int __ns1__sendMessageEx(struct soap*, _ns1__sendMessageEx *ns1__sendMessageEx, _ns1__sendMessageExResponse *ns1__sendMessageExResponse)
    {
    CServer* pServer = CServer::Instance();

    struct soap* soap = ns1__sendMessageEx->soap;
    SOAP_SOCKET slave =ns1__sendMessageEx->soap->socket; //查找sessionId,如过不是只能session中id,则返回sessionId 0.
    CSingleAXLock lockid(pServer->m_mtxQueue);
    map<SOAP_SOCKET, int>::iterator iter = pServer->m_mapSessionId.find(slave);
    int nSessionId = 0;
    if (iter != pServer->m_mapSessionId.end())
    {
    nSessionId = iter->second;
    }
    pServer->m_mapSessionId.erase(iter);
    lockid.release();
    string* str = (string*)soap_malloc(soap,__GsoapBuffer_Max_Length);
    GsoapData data;
    data.nCmdCode = 1;
    data.nPara1 = 1;
    data.nPara2 = 1;
    data.strPara1 = "a";
    data.strPara2 = "a"; string strXml = *ns1__sendMessageEx->in0;
    //解析xml 并获得SessionId
    //数据回调

    int nPacgeId = pServer->m_pGsoapServer->GsoapOnData(data,nSessionId); //加入map
    Map_DataInfo map_data;
    HANDLE hEvent = CreateEvent(NULL, true, false , NULL);
    map_data.hEvent = hEvent;
    pServer->m_mapDataInfo[nPacgeId] = map_data;
    DWORD dwRet = WaitForSingleObject(hEvent, pServer->m_nDataWaitTimeOut);
    string strRet;
    CSingleAXLock lock(pServer->m_mtxQueue);
    map<int, Map_DataInfo>::iterator it = pServer->m_mapDataInfo.find(nPacgeId);
    switch(dwRet)
    {
    case WAIT_OBJECT_0:
    {
    strRet = it->second.strData; }
    break;
    default:
    {
    //超时删除
    pServer->m_mapDataInfo.erase(it);
    return 0;
    }
    }
    lock.release();
    memset(str,0,__GsoapBuffer_Max_Length);
    if (strRet.length() > __GsoapBuffer_Max_Length)
    {
    return 0;
    }
    memcpy((char*)str->c_str(),(char*)strRet.c_str(),strRet.length());
    ns1__sendMessageExResponse->out = str; return 0;
    }CServer* CServer::_this = NULL;CServer* CServer::Instance(void)
    {
    if (NULL == _this)
    {
    _this = new CServer;
    }
    return _this;
    }
    CServer::CServer()
    {
    //默认启动四个线程监听
    m_nThreadNum = 4;
    m_bRunning = false;
    m_pGsoapServer = NULL;
    m_nDataWaitTimeOut = 5000;
    }CServer::~CServer(void)
    {}int CServer::SetListenThreadNum(int nNum)
    {
    if (m_bRunning)
    {
    return -1;
    } m_nThreadNum = nNum; return 1;
    }
    int CServer::StartServer(int nPort)
    {
    int nRet = 0;
    //开启监听
    nRet = Listen(nPort);
    if (nRet < 0)
    {
    return -1;
    } //开启服务线程
    for (int i = 0; i < m_nThreadNum; i++)
    {
    CGsoapThread* pThread = new CGsoapThread;
    struct soap* pSoap = soap_copy(&m_soapServer);
    pThread->InitThread(pSoap, this);
    m_vctThread.push_back(pThread);
    } //开启接受请求线程
    start();
    return 1;
    }int CServer::StopServer()
    {
    for (int i = 0; i < m_vctThread.size(); i++)
    {
    m_vctThread[i]->UnInit();
    SAFE_DELETE(m_vctThread[i]);
    } stop();
    return 0;
    }void CServer::SetWaitDataTimeOut(int nDataWaitTimeOut)
    {
    CSingleAXLock lock(m_mtxQueue);
    m_nDataWaitTimeOut = nDataWaitTimeOut;
    lock.release();
    }void CServer::SetGsoapServer(CGsoapServer* pGsoapServer)
    {
    m_pGsoapServer = pGsoapServer;
    }
    int CServer::Listen(int nPort)
    {
    soap_init(&m_soapServer);
    int nRet = -1;
    nRet = soap_bind(&m_soapServer, NULL, nPort, 100);

    if (nRet < 0)
    {
    return nRet;
    }
    return 1;
    }int CServer::run()
    {
    if (m_dequeSoapSocket.size()  == __Socket_Deque_Max_Length)
    {
    Sleep(1000);
    return 0;
    } SOAP_SOCKET slave;
    slave = soap_accept(&m_soapServer);
    if (!soap_valid_socket(slave)) 
    {
    return 0;
    }
    //接受请求,并放入队列中 //如果有限制会话数量,则滤除不是会话的IP
    if (m_mapSession.size() != 0)
    {
    char szIpAddr[32];
    sprintf(szIpAddr, "%d.%d.%d.%d", 
    ((m_soapServer.ip)>>24)&0xFF,((m_soapServer.ip)>>16)&0xFF,((m_soapServer.ip)>>8)&0xFF,(m_soapServer.ip)&0xFF);
    string strIp(szIpAddr); CSingleAXLock lockId(m_mtxQueue);
    for(map<int, GsoapSessionInfo>::iterator it = m_mapSession.begin();
    it != m_mapSession.end(); it++)
    {
    if (it->second.Ip == strIp)
    {
    m_mapSessionId[slave] = it->second.nSessionId;
    }
    }
    lockId.release();
    } CSingleAXLock lock(m_mtxQueue);
    m_dequeSoapSocket.push_back(slave);
    lock.release();

    return 0;
    }int CServer::GsoapOnAckData(string strData, int nPackageId)
    {
    map<int, Map_DataInfo>::iterator it = m_mapDataInfo.find(nPackageId);
    if (it == m_mapDataInfo.end())
    {
    return -1;
    } it->second.strData = strData;
    HANDLE hEvent = it->second.hEvent;
    SetEvent(hEvent);
    return 0;
    }int CServer::AddSessionId(GsoapSessionInfo sessioninfo)
    {
    CSingleAXLock lockId(m_mtxQueue);
    for(map<int, GsoapSessionInfo>::iterator it = m_mapSession.begin();
    it != m_mapSession.end(); it++)
    {
    if (it->second.nSessionId == sessioninfo.nSessionId)
    {
    lockId.release();
    return -1;
    }
    }
    m_mapSession[sessioninfo.nSessionId] = sessioninfo;
    lockId.release();
    return 0;
    }
    int CServer::RemoveSessionId(int nSessionId)
    {
    CSingleAXLock lockId(m_mtxQueue);
    map<int, GsoapSessionInfo>::iterator it = m_mapSession.find(nSessionId);
    if (it != m_mapSession.end())
    {
    m_mapSession.erase(it);
    lockId.release();
    return 0;
    }
    lockId.release();
    return -1;
    }
      

  3.   

    gsoap是对soap的一种封装,底层是tcp,socket短连接。查看过封装的api还是很详细的,网上也有不少的例子,根据自己不同的使用,觉得还是有很多可挖掘的地方,注意别内存泄露就好。尤其是电信都是用webservice,vc访问基本用Gsoap了,开发快。