VC++ gSOAP 谁做成功的阿......找了好多资料都不成功..谢谢各位大侠了
解决方案 »
- TinyXML的用法
- Rich Edit控件插入GIF,注册ImageOle.dll成功后,还是不能使用该DLL???
- 求教vc++6.0如何导入导出excal
- 程序界面高手回答
- 我做了几年的IT工作,现在想考CCIE,我应该从哪本书开始学起?哪里有初学的资料下载?
- 一个简单的问题,急,在线等
- 动态创建一个edit之后,如何不用鼠标点击就可以在edit内显示输入光标?
- 邮件发送
- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfab2/html/odc_faboverpage.asp
- dll导出类成员方法
- ...exe已停止工作,请问是什么原因啊?
- 网络寻址?
#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;
}