整理websdk目录,重理类的继承关系
This commit is contained in:
parent
fd0e1f82bd
commit
6cc1cfddfb
|
@ -19,30 +19,32 @@
|
|||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\sdk\webservice\HttpHead.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\HttpUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\HttpHead.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\HttpUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\Manager.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\MsgLoop.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\SockIoServer.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\SockIoUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\HttpServer.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\WebServer.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\1.0\WebUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\main.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\Manager.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\MsgLoop.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\SockIoUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\WebServer.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\WebUser.cpp" />
|
||||
<ClCompile Include="..\..\..\sdk\webservice\WsUser.cpp" />
|
||||
<ClCompile Include="..\..\..\third_party\base64\base64.cpp" />
|
||||
<ClCompile Include="..\..\..\third_party\json\cJSON.c" />
|
||||
<ClCompile Include="..\..\..\third_party\sha1\sha1.cpp" />
|
||||
<ClCompile Include="..\..\..\utility\HGString.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\sdk\webservice\HttpHead.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\HttpUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\Manager.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\MsgLoop.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\SockIoUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\WebMsg.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\WebServer.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\WebUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\WsUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\HttpHead.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\HttpUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\Manager.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\MsgLoop.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\SockIoServer.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\SockIoUser.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\WebMsg.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\HttpServer.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\WebServer.h" />
|
||||
<ClInclude Include="..\..\..\sdk\webservice\1.0\WebUser.h" />
|
||||
<ClInclude Include="..\..\..\third_party\base64\base64.h" />
|
||||
<ClInclude Include="..\..\..\third_party\json\cJSON.h" />
|
||||
<ClInclude Include="..\..\..\third_party\sha1\sha1.h" />
|
||||
|
@ -120,6 +122,7 @@
|
|||
<ConformanceMode>true</ConformanceMode>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<DisableSpecificWarnings>28251;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
#include "HttpServer.h"
|
||||
#include "HttpUser.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
||||
HttpServer::HttpServer(class MsgLoop* loop, class Manager* manager)
|
||||
: WebServer(loop, manager)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
HttpServer::~HttpServer()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void HttpServer::Connect(const ConnectParam* param)
|
||||
{
|
||||
assert(NULL != param);
|
||||
|
||||
WebUser* user = new HttpUser(this, m_currUserId, param->ip, param->port, param->socket);
|
||||
user->Open();
|
||||
++m_currUserId;
|
||||
m_vectorUser.push_back(user);
|
||||
}
|
||||
|
||||
void HttpServer::Command(HGUInt usrId, const HttpCmdParam* param)
|
||||
{
|
||||
int nIndex = GetUserIndex(usrId);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
((HttpUser*)m_vectorUser[nIndex])->HandleCmd(param);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
#ifndef __HTTPSERVER_H__
|
||||
#define __HTTPSERVER_H__
|
||||
|
||||
#include "WebServer.h"
|
||||
#include "WebMsg.h"
|
||||
|
||||
class HttpServer : public WebServer
|
||||
{
|
||||
public:
|
||||
HttpServer(class MsgLoop *loop, class Manager *manager);
|
||||
virtual ~HttpServer();
|
||||
|
||||
void Connect(const ConnectParam *param);
|
||||
void Command(HGUInt usrId, const HttpCmdParam *param);
|
||||
};
|
||||
|
||||
#endif /* __HTTPSERVER_H__ */
|
|
@ -1,5 +1,4 @@
|
|||
#include "HttpUser.h"
|
||||
#include "WebServer.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "Manager.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
@ -744,7 +743,7 @@ void HttpUser::ThreadFunc()
|
|||
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -786,7 +785,7 @@ void HttpUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -810,8 +809,8 @@ void HttpUser::ThreadFunc()
|
|||
param->size = 0;
|
||||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_HTTPCMD;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.msgId = WEB_MSGID_COMMAND;
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = param;
|
||||
bool b = GetLoop()->Send(&msg);
|
||||
|
@ -837,8 +836,8 @@ void HttpUser::ThreadFunc()
|
|||
memcpy(param->data, data, dataSize);
|
||||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_HTTPCMD;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.msgId = WEB_MSGID_COMMAND;
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = param;
|
||||
bool b = GetLoop()->Send(&msg);
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef __HTTPUSER_H__
|
||||
#define __HTTPUSER_H__
|
||||
|
||||
#include "WebMsg.h"
|
||||
#include "WebUser.h"
|
||||
#include "WebMsg.h"
|
||||
|
||||
class HttpUser : public WebUser
|
||||
{
|
|
@ -1896,7 +1896,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
|
|||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_OPENDEV;
|
||||
msg.svrType = 0;
|
||||
msg.svr = NULL;
|
||||
msg.usrId = 0;
|
||||
msg.param = openDevParam;
|
||||
bool b = p->m_loop->Send(&msg);
|
||||
|
@ -1921,7 +1921,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
|
|||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_CLOSEDEV;
|
||||
msg.svrType = 0;
|
||||
msg.svr = NULL;
|
||||
msg.usrId = 0;
|
||||
msg.param = closeDevParam;
|
||||
bool b = p->m_loop->Send(&msg);
|
||||
|
@ -2062,7 +2062,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
|
|||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_SCANFINISH;
|
||||
msg.svrType = 0;
|
||||
msg.svr = NULL;
|
||||
msg.usrId = 0;
|
||||
msg.param = NULL;
|
||||
p->m_loop->Send(&msg);
|
|
@ -0,0 +1,181 @@
|
|||
#include "MsgLoop.h"
|
||||
|
||||
MsgLoop::MsgLoop()
|
||||
{
|
||||
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
|
||||
HGBase_CreateLock(&m_msgLock);
|
||||
m_bRecvMsg = HGTRUE;
|
||||
|
||||
m_manager = new Manager(this);
|
||||
m_httpServer = new HttpServer(this, m_manager);
|
||||
m_sockIoServer = new SockIoServer(this, m_manager);
|
||||
}
|
||||
|
||||
MsgLoop::~MsgLoop()
|
||||
{
|
||||
delete m_httpServer;
|
||||
m_httpServer = NULL;
|
||||
delete m_sockIoServer;
|
||||
m_sockIoServer = NULL;
|
||||
delete m_manager;
|
||||
m_manager = NULL;
|
||||
|
||||
HGBase_DestroyLock(m_msgLock);
|
||||
m_msgLock = NULL;
|
||||
HGBase_DestroyEvent(m_msgEvent);
|
||||
m_msgEvent = NULL;
|
||||
}
|
||||
|
||||
bool MsgLoop::Send(const WebMsg* msg)
|
||||
{
|
||||
if (NULL == msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = false;
|
||||
HGBase_EnterLock(m_msgLock);
|
||||
if (m_bRecvMsg)
|
||||
{
|
||||
m_listMsg.push_back(*msg);
|
||||
HGBase_SetEvent(m_msgEvent);
|
||||
|
||||
if (WEB_MSGID_QUIT == msg->msgId)
|
||||
m_bRecvMsg = HGFALSE;
|
||||
ret = true;
|
||||
}
|
||||
HGBase_LeaveLock(m_msgLock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void MsgLoop::Loop()
|
||||
{
|
||||
m_httpServer->Open(18999);
|
||||
m_sockIoServer->Open(28999);
|
||||
|
||||
while (1)
|
||||
{
|
||||
HGBase_WaitEvent(m_msgEvent);
|
||||
|
||||
WebMsg msg = { 0 };
|
||||
HGBase_EnterLock(m_msgLock);
|
||||
if (!m_listMsg.empty())
|
||||
{
|
||||
msg = m_listMsg.front();
|
||||
m_listMsg.pop_front();
|
||||
}
|
||||
if (m_listMsg.empty())
|
||||
{
|
||||
HGBase_ResetEvent(m_msgEvent);
|
||||
}
|
||||
HGBase_LeaveLock(m_msgLock);
|
||||
|
||||
if (0 == msg.msgId)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (WEB_MSGID_QUIT == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.svr);
|
||||
assert(0 == msg.usrId);
|
||||
assert(NULL == msg.param);
|
||||
|
||||
break;
|
||||
}
|
||||
else if (WEB_MSGID_CONNET == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.svr);
|
||||
assert(0 == msg.usrId);
|
||||
assert(NULL != msg.param);
|
||||
|
||||
ConnectParam* param = (ConnectParam*)msg.param;
|
||||
if (msg.svr == m_httpServer)
|
||||
m_httpServer->Connect(param);
|
||||
else if (msg.svr == m_sockIoServer)
|
||||
m_sockIoServer->Connect(param);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_DISCONNET == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.svr);
|
||||
assert(0 != msg.usrId);
|
||||
assert(NULL == msg.param);
|
||||
|
||||
if (msg.svr == m_httpServer)
|
||||
m_httpServer->DisConnect(msg.usrId);
|
||||
else if (msg.svr == m_sockIoServer)
|
||||
m_sockIoServer->DisConnect(msg.usrId);
|
||||
}
|
||||
else if (WEB_MSGID_COMMAND == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.svr);
|
||||
assert(0 != msg.usrId);
|
||||
assert(NULL != msg.param);
|
||||
|
||||
if (msg.svr == m_httpServer)
|
||||
{
|
||||
HttpCmdParam* param = (HttpCmdParam*)msg.param;
|
||||
m_httpServer->Command(msg.usrId, param);
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
else if (msg.svr == m_sockIoServer)
|
||||
{
|
||||
SockIoCmdParam* param = (SockIoCmdParam*)msg.param;
|
||||
m_sockIoServer->Command(msg.usrId, param);
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
}
|
||||
else if (WEB_MSGID_EVENT == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.svr);
|
||||
assert(0 != msg.usrId);
|
||||
assert(NULL != msg.param);
|
||||
|
||||
if (msg.svr == m_sockIoServer)
|
||||
{
|
||||
SockIoEvtParam* param = (SockIoEvtParam*)msg.param;
|
||||
m_sockIoServer->Event(msg.usrId, param);
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
}
|
||||
else if (WEB_MSGID_OPENDEV == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.svr);
|
||||
assert(0 == msg.usrId);
|
||||
assert(NULL != msg.param);
|
||||
|
||||
OpenDevParam* param = (OpenDevParam*)msg.param;
|
||||
m_manager->OpenDev(param);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_CLOSEDEV == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.svr);
|
||||
assert(0 == msg.usrId);
|
||||
assert(NULL != msg.param);
|
||||
|
||||
CloseDevParam* param = (CloseDevParam*)msg.param;
|
||||
m_manager->CloseDev(param);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_SCANFINISH == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.svr);
|
||||
assert(0 == msg.usrId);
|
||||
assert(NULL == msg.param);
|
||||
|
||||
m_manager->ScanFinish();
|
||||
}
|
||||
}
|
||||
|
||||
m_httpServer->Close();
|
||||
m_sockIoServer->Close();
|
||||
}
|
|
@ -7,7 +7,8 @@
|
|||
#include "base/HGLock.h"
|
||||
#include "WebMsg.h"
|
||||
#include "Manager.h"
|
||||
#include "WebServer.h"
|
||||
#include "HttpServer.h"
|
||||
#include "SockIoServer.h"
|
||||
#include <list>
|
||||
|
||||
class MsgLoop
|
||||
|
@ -18,7 +19,6 @@ public:
|
|||
|
||||
bool Send(const WebMsg* msg);
|
||||
void Loop();
|
||||
Manager* GetManager();
|
||||
|
||||
private:
|
||||
HGEvent m_msgEvent;
|
||||
|
@ -27,9 +27,8 @@ private:
|
|||
std::list<WebMsg> m_listMsg;
|
||||
|
||||
Manager *m_manager;
|
||||
WebServer *m_httpServer;
|
||||
WebServer *m_sockIoServer;
|
||||
WebServer* m_wsServer;
|
||||
HttpServer *m_httpServer;
|
||||
SockIoServer *m_sockIoServer;
|
||||
};
|
||||
|
||||
#endif /* __MSGLOOP_H__ */
|
|
@ -0,0 +1,42 @@
|
|||
#include "SockIoServer.h"
|
||||
#include "SockIoUser.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
||||
SockIoServer::SockIoServer(class MsgLoop* loop, class Manager* manager)
|
||||
: WebServer(loop, manager)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SockIoServer::~SockIoServer()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SockIoServer::Connect(const ConnectParam* param)
|
||||
{
|
||||
assert(NULL != param);
|
||||
|
||||
WebUser* user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket);
|
||||
user->Open();
|
||||
++m_currUserId;
|
||||
m_vectorUser.push_back(user);
|
||||
}
|
||||
|
||||
void SockIoServer::Command(HGUInt usrId, const SockIoCmdParam* param)
|
||||
{
|
||||
int nIndex = GetUserIndex(usrId);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
((SockIoUser*)m_vectorUser[nIndex])->HandleCmd(param);
|
||||
}
|
||||
}
|
||||
|
||||
void SockIoServer::Event(HGUInt usrId, const SockIoEvtParam* param)
|
||||
{
|
||||
int nIndex = GetUserIndex(usrId);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
((SockIoUser*)m_vectorUser[nIndex])->HandleEvent(param);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef __SOCKIOSERVER_H__
|
||||
#define __SOCKIOSERVER_H__
|
||||
|
||||
#include "WebServer.h"
|
||||
#include "WebMsg.h"
|
||||
|
||||
class SockIoServer : public WebServer
|
||||
{
|
||||
public:
|
||||
SockIoServer(class MsgLoop *loop, class Manager *manager);
|
||||
virtual ~SockIoServer();
|
||||
|
||||
void Connect(const ConnectParam *param);
|
||||
void Command(HGUInt usrId, const SockIoCmdParam *param);
|
||||
void Event(HGUInt usrId, const SockIoEvtParam* param);
|
||||
};
|
||||
|
||||
#endif /* __SOCKIOSERVER_H__ */
|
|
@ -1,5 +1,4 @@
|
|||
#include "SockIoUser.h"
|
||||
#include "WebServer.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "Manager.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
@ -9,9 +8,9 @@
|
|||
#include "cJSON.h"
|
||||
|
||||
#if defined(HG_CMP_MSC)
|
||||
SockIoUser::SockIoUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn)
|
||||
SockIoUser::SockIoUser(class SockIoServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn)
|
||||
#else
|
||||
SockIoUser::SockIoUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, int sockConn)
|
||||
SockIoUser::SockIoUser(class SockIoServer* server, HGUInt id, const char* ip, uint16_t port, int sockConn)
|
||||
#endif
|
||||
: WebUser(server, id, ip, port, sockConn)
|
||||
{
|
||||
|
@ -70,7 +69,7 @@ void SockIoUser::HandleCmd(const SockIoCmdParam* param)
|
|||
}
|
||||
}
|
||||
|
||||
void SockIoUser::HandleRet(const SockIoRetParam* param)
|
||||
void SockIoUser::HandleEvent(const SockIoEvtParam* param)
|
||||
{
|
||||
SendResponse(param->data, param->size, HGTRUE);
|
||||
}
|
||||
|
@ -109,7 +108,7 @@ void SockIoUser::ThreadFunc()
|
|||
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -154,7 +153,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -182,7 +181,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -214,7 +213,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -227,7 +226,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -240,7 +239,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -253,7 +252,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -271,7 +270,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -306,7 +305,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -345,7 +344,7 @@ void SockIoUser::ThreadFunc()
|
|||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
|
@ -410,8 +409,8 @@ void SockIoUser::ThreadFunc()
|
|||
memcpy(param->data, &vAllData[0], vAllData.size());
|
||||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_SOCKIOCMD;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.msgId = WEB_MSGID_COMMAND;
|
||||
msg.svr = m_server;
|
||||
msg.usrId = m_id;
|
||||
msg.param = param;
|
||||
bool b = GetLoop()->Send(&msg);
|
||||
|
@ -480,14 +479,14 @@ void SockIoUser::ScanCallback(HGUInt event, void* value1, void* value2, void* pa
|
|||
|
||||
if (NULL != resp)
|
||||
{
|
||||
SockIoRetParam* param = new SockIoRetParam;
|
||||
SockIoEvtParam* param = new SockIoEvtParam;
|
||||
param->data = new HGByte[strlen(resp)];
|
||||
param->size = (HGUInt)strlen(resp);
|
||||
memcpy(param->data, resp, strlen(resp));
|
||||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_SOCKIORET;
|
||||
msg.svrType = p->m_server->GetType();
|
||||
msg.msgId = WEB_MSGID_EVENT;
|
||||
msg.svr = p->m_server;
|
||||
msg.usrId = p->m_id;
|
||||
msg.param = param;
|
||||
bool b = p->GetLoop()->Send(&msg);
|
|
@ -1,21 +1,21 @@
|
|||
#ifndef __SOCKIOUSER_H__
|
||||
#define __SOCKIOUSER_H__
|
||||
|
||||
#include "WebMsg.h"
|
||||
#include "WebUser.h"
|
||||
#include "WebMsg.h"
|
||||
|
||||
class SockIoUser : public WebUser
|
||||
{
|
||||
public:
|
||||
#if defined(HG_CMP_MSC)
|
||||
SockIoUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn);
|
||||
SockIoUser(class SockIoServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn);
|
||||
#else
|
||||
SockIoUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, int sockConn);
|
||||
SockIoUser(class SockIoServer* server, HGUInt id, const char* ip, uint16_t port, int sockConn);
|
||||
#endif
|
||||
virtual ~SockIoUser();
|
||||
|
||||
void HandleCmd(const SockIoCmdParam* param);
|
||||
void HandleRet(const SockIoRetParam* param);
|
||||
void HandleEvent(const SockIoEvtParam* param);
|
||||
|
||||
protected:
|
||||
virtual void ThreadFunc();
|
|
@ -6,23 +6,22 @@
|
|||
#include "HttpHead.h"
|
||||
#include <string>
|
||||
|
||||
#define WEB_MSGID_QUIT 1
|
||||
#define WEB_MSGID_CONNET 2
|
||||
#define WEB_MSGID_DISCONNET 3
|
||||
#define WEB_MSGID_WSCMD 4
|
||||
#define WEB_MSGID_HTTPCMD 5
|
||||
#define WEB_MSGID_SOCKIOCMD 6
|
||||
#define WEB_MSGID_WSRET 7
|
||||
#define WEB_MSGID_HTTPRET 8
|
||||
#define WEB_MSGID_SOCKIORET 9
|
||||
#define WEB_MSGID_OPENDEV 10
|
||||
#define WEB_MSGID_CLOSEDEV 11
|
||||
#define WEB_MSGID_SCANFINISH 12
|
||||
enum WebMsgId
|
||||
{
|
||||
WEB_MSGID_QUIT = 1,
|
||||
WEB_MSGID_CONNET,
|
||||
WEB_MSGID_DISCONNET,
|
||||
WEB_MSGID_COMMAND,
|
||||
WEB_MSGID_EVENT,
|
||||
WEB_MSGID_OPENDEV,
|
||||
WEB_MSGID_CLOSEDEV,
|
||||
WEB_MSGID_SCANFINISH
|
||||
};
|
||||
|
||||
struct WebMsg
|
||||
{
|
||||
HGUInt msgId; /* WEB_MSGID_** */
|
||||
HGUInt svrType; /* svrType */
|
||||
HGPointer svr; /* server */
|
||||
HGUInt usrId; /* usrId */
|
||||
HGPointer param; /* param */
|
||||
};
|
||||
|
@ -38,12 +37,6 @@ struct ConnectParam
|
|||
#endif
|
||||
};
|
||||
|
||||
struct WsCmdParam
|
||||
{
|
||||
HGByte *data;
|
||||
HGUInt size;
|
||||
};
|
||||
|
||||
struct HttpCmdParam
|
||||
{
|
||||
HttpHead head;
|
||||
|
@ -57,7 +50,7 @@ struct SockIoCmdParam
|
|||
HGUInt size;
|
||||
};
|
||||
|
||||
struct SockIoRetParam
|
||||
struct SockIoEvtParam
|
||||
{
|
||||
HGByte* data;
|
||||
HGUInt size;
|
|
@ -1,14 +1,12 @@
|
|||
#include "WebServer.h"
|
||||
#include "WebServer.h"
|
||||
#include "WebUser.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "WsUser.h"
|
||||
#include "HttpUser.h"
|
||||
#include "SockIoUser.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
||||
WebServer::WebServer(class MsgLoop* loop, HGUInt type)
|
||||
WebServer::WebServer(class MsgLoop* loop, class Manager* manager)
|
||||
{
|
||||
m_loop = loop;
|
||||
m_type = type;
|
||||
m_manager = manager;
|
||||
|
||||
m_currUserId = 1;
|
||||
#if defined(HG_CMP_MSC)
|
||||
|
@ -29,9 +27,9 @@ class MsgLoop* WebServer::GetLoop()
|
|||
return m_loop;
|
||||
}
|
||||
|
||||
HGUInt WebServer::GetType()
|
||||
class Manager* WebServer::GetManager()
|
||||
{
|
||||
return m_type;
|
||||
return m_manager;
|
||||
}
|
||||
|
||||
bool WebServer::Open(HGUShort port)
|
||||
|
@ -131,38 +129,11 @@ bool WebServer::Close()
|
|||
return true;
|
||||
}
|
||||
|
||||
void WebServer::HandleMsg(const WebMsg* msg)
|
||||
void WebServer::DisConnect(HGUInt usrId)
|
||||
{
|
||||
assert(NULL != msg);
|
||||
assert(msg->svrType == m_type);
|
||||
assert(0 != usrId);
|
||||
|
||||
if (WEB_MSGID_CONNET == msg->msgId)
|
||||
{
|
||||
assert(0 == msg->usrId);
|
||||
ConnectParam* param = (ConnectParam*)msg->param;
|
||||
assert(NULL != param);
|
||||
|
||||
WebUser* user = NULL;
|
||||
if (ServerType_Ws == m_type)
|
||||
user = new WsUser(this, m_currUserId, param->ip, param->port, param->socket);
|
||||
else if (ServerType_Http == m_type)
|
||||
user = new HttpUser(this, m_currUserId, param->ip, param->port, param->socket);
|
||||
else
|
||||
user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket);
|
||||
|
||||
// 打开接收线程
|
||||
user->Open();
|
||||
|
||||
++m_currUserId;
|
||||
m_vectorUser.push_back(user);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_DISCONNET == msg->msgId)
|
||||
{
|
||||
HGUInt id = (HGUInt)msg->usrId;
|
||||
assert(NULL == msg->param);
|
||||
|
||||
int nIndex = GetUserIndex(id);
|
||||
int nIndex = GetUserIndex(usrId);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
WebUser* pUser = m_vectorUser[nIndex];
|
||||
|
@ -171,75 +142,6 @@ void WebServer::HandleMsg(const WebMsg* msg)
|
|||
pUser = NULL;
|
||||
}
|
||||
}
|
||||
else if (WEB_MSGID_WSCMD == msg->msgId)
|
||||
{
|
||||
HGUInt id = (HGUInt)msg->usrId;
|
||||
WsCmdParam* param = (WsCmdParam*)msg->param;
|
||||
assert(NULL != param);
|
||||
|
||||
int nIndex = GetUserIndex(id);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
WsUser* user = (WsUser*)m_vectorUser[nIndex];
|
||||
user->HandleCmd(param);
|
||||
}
|
||||
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_HTTPCMD == msg->msgId)
|
||||
{
|
||||
HGUInt id = (HGUInt)msg->usrId;
|
||||
HttpCmdParam* param = (HttpCmdParam*)msg->param;
|
||||
assert(NULL != param);
|
||||
|
||||
int nIndex = GetUserIndex(id);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
HttpUser* user = (HttpUser*)m_vectorUser[nIndex];
|
||||
user->HandleCmd(param);
|
||||
}
|
||||
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_SOCKIOCMD == msg->msgId)
|
||||
{
|
||||
HGUInt id = (HGUInt)msg->usrId;
|
||||
SockIoCmdParam* param = (SockIoCmdParam*)msg->param;
|
||||
assert(NULL != param);
|
||||
|
||||
int nIndex = GetUserIndex(id);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
SockIoUser* user = (SockIoUser*)m_vectorUser[nIndex];
|
||||
user->HandleCmd(param);
|
||||
}
|
||||
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_SOCKIORET == msg->msgId)
|
||||
{
|
||||
HGUInt id = (HGUInt)msg->usrId;
|
||||
SockIoRetParam* param = (SockIoRetParam*)msg->param;
|
||||
assert(NULL != param);
|
||||
|
||||
int nIndex = GetUserIndex(id);
|
||||
if (-1 != nIndex)
|
||||
{
|
||||
SockIoUser* user = (SockIoUser*)m_vectorUser[nIndex];
|
||||
user->HandleRet(param);
|
||||
}
|
||||
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
}
|
||||
|
||||
int WebServer::GetUserIndex(HGUInt id)
|
||||
{
|
||||
|
@ -274,7 +176,7 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
|
|||
if (-1 == socketConn)
|
||||
#endif
|
||||
{
|
||||
// 这里跳出,可能是服务器关闭了m_sockServer
|
||||
// 这里跳出,可能是服务器关闭了m_sockServer
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -285,7 +187,7 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
|
|||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_CONNET;
|
||||
msg.svrType = p->m_type;
|
||||
msg.svr = p;
|
||||
msg.usrId = 0;
|
||||
msg.param = param;
|
||||
bool b = p->m_loop->Send(&msg);
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __WEBSERVER_H__
|
||||
#ifndef __WEBSERVER_H__
|
||||
#define __WEBSERVER_H__
|
||||
|
||||
#include "base/HGDef.h"
|
||||
|
@ -7,30 +7,28 @@
|
|||
#include "WebMsg.h"
|
||||
#include <vector>
|
||||
|
||||
#define ServerType_Ws 1L
|
||||
#define ServerType_Http 2L
|
||||
#define ServerType_SockIo 3L
|
||||
|
||||
class WebServer
|
||||
{
|
||||
public:
|
||||
WebServer(class MsgLoop *loop, HGUInt type);
|
||||
~WebServer();
|
||||
WebServer(class MsgLoop* loop, class Manager* manager);
|
||||
virtual ~WebServer();
|
||||
|
||||
class MsgLoop* GetLoop();
|
||||
HGUInt GetType();
|
||||
class Manager* GetManager();
|
||||
|
||||
bool Open(HGUShort port);
|
||||
bool Close();
|
||||
void HandleMsg(const WebMsg* msg);
|
||||
|
||||
private:
|
||||
virtual void Connect(const ConnectParam* param) = 0;
|
||||
void DisConnect(HGUInt usrId);
|
||||
|
||||
protected:
|
||||
int GetUserIndex(HGUInt id);
|
||||
static void ThreadFunc(HGThread thread, HGPointer param);
|
||||
|
||||
private:
|
||||
protected:
|
||||
class MsgLoop* m_loop;
|
||||
HGUInt m_type;
|
||||
class Manager* m_manager;
|
||||
|
||||
HGUInt m_currUserId;
|
||||
#if defined(HG_CMP_MSC)
|
|
@ -1,6 +1,5 @@
|
|||
#include "WebUser.h"
|
||||
#include "WebServer.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "base/HGInfo.h"
|
||||
|
||||
#if defined(HG_CMP_MSC)
|
||||
|
@ -56,7 +55,7 @@ class MsgLoop* WebUser::GetLoop()
|
|||
|
||||
class Manager* WebUser::GetManager()
|
||||
{
|
||||
return m_server->GetLoop()->GetManager();
|
||||
return m_server->GetManager();
|
||||
}
|
||||
|
||||
void WebUser::ThreadFunc()
|
|
@ -1,172 +0,0 @@
|
|||
#include "MsgLoop.h"
|
||||
|
||||
MsgLoop::MsgLoop()
|
||||
{
|
||||
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
|
||||
HGBase_CreateLock(&m_msgLock);
|
||||
m_bRecvMsg = HGTRUE;
|
||||
|
||||
if (1) // 使用旧协议
|
||||
{
|
||||
m_manager = new Manager(this);
|
||||
m_httpServer = new WebServer(this, ServerType_Http);
|
||||
m_sockIoServer = new WebServer(this, ServerType_SockIo);
|
||||
m_wsServer = NULL;
|
||||
}
|
||||
else // 使用新协议
|
||||
{
|
||||
m_manager = NULL;
|
||||
m_httpServer = NULL;
|
||||
m_sockIoServer = NULL;
|
||||
m_wsServer = new WebServer(this, ServerType_Ws);
|
||||
}
|
||||
}
|
||||
|
||||
MsgLoop::~MsgLoop()
|
||||
{
|
||||
if (NULL != m_wsServer)
|
||||
{
|
||||
delete m_wsServer;
|
||||
m_wsServer = NULL;
|
||||
}
|
||||
if (NULL != m_sockIoServer)
|
||||
{
|
||||
delete m_sockIoServer;
|
||||
m_sockIoServer = NULL;
|
||||
}
|
||||
if (NULL != m_httpServer)
|
||||
{
|
||||
delete m_httpServer;
|
||||
m_httpServer = NULL;
|
||||
}
|
||||
if (NULL != m_manager)
|
||||
{
|
||||
delete m_manager;
|
||||
m_manager = NULL;
|
||||
}
|
||||
|
||||
HGBase_DestroyLock(m_msgLock);
|
||||
m_msgLock = NULL;
|
||||
HGBase_DestroyEvent(m_msgEvent);
|
||||
m_msgEvent = NULL;
|
||||
}
|
||||
|
||||
bool MsgLoop::Send(const WebMsg* msg)
|
||||
{
|
||||
if (NULL == msg)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = false;
|
||||
HGBase_EnterLock(m_msgLock);
|
||||
if (m_bRecvMsg)
|
||||
{
|
||||
m_listMsg.push_back(*msg);
|
||||
HGBase_SetEvent(m_msgEvent);
|
||||
|
||||
if (WEB_MSGID_QUIT == msg->msgId)
|
||||
m_bRecvMsg = HGFALSE;
|
||||
ret = true;
|
||||
}
|
||||
HGBase_LeaveLock(m_msgLock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void MsgLoop::Loop()
|
||||
{
|
||||
if (NULL != m_httpServer)
|
||||
m_httpServer->Open(18999);
|
||||
if (NULL != m_sockIoServer)
|
||||
m_sockIoServer->Open(28999);
|
||||
if (NULL != m_wsServer)
|
||||
m_wsServer->Open(38999);
|
||||
|
||||
while (1)
|
||||
{
|
||||
HGBase_WaitEvent(m_msgEvent);
|
||||
|
||||
WebMsg msg = { 0 };
|
||||
HGBase_EnterLock(m_msgLock);
|
||||
if (!m_listMsg.empty())
|
||||
{
|
||||
msg = m_listMsg.front();
|
||||
m_listMsg.pop_front();
|
||||
}
|
||||
HGBase_LeaveLock(m_msgLock);
|
||||
|
||||
if (0 != msg.msgId)
|
||||
{
|
||||
if (0 == msg.svrType)
|
||||
{
|
||||
assert(0 == msg.usrId);
|
||||
if (WEB_MSGID_QUIT == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.param);
|
||||
|
||||
if (NULL != m_wsServer)
|
||||
m_wsServer->Close();
|
||||
if (NULL != m_sockIoServer)
|
||||
m_sockIoServer->Close();
|
||||
if (NULL != m_httpServer)
|
||||
m_httpServer->Close();
|
||||
}
|
||||
else if (WEB_MSGID_OPENDEV == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.param);
|
||||
OpenDevParam* param = (OpenDevParam*)msg.param;
|
||||
if (NULL != m_manager)
|
||||
m_manager->OpenDev(param);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_CLOSEDEV == msg.msgId)
|
||||
{
|
||||
assert(NULL != msg.param);
|
||||
CloseDevParam* param = (CloseDevParam*)msg.param;
|
||||
if (NULL != m_manager)
|
||||
m_manager->CloseDev(param);
|
||||
delete param;
|
||||
}
|
||||
else if (WEB_MSGID_SCANFINISH == msg.msgId)
|
||||
{
|
||||
assert(NULL == msg.param);
|
||||
if (NULL != m_manager)
|
||||
m_manager->ScanFinish();
|
||||
}
|
||||
}
|
||||
else if (ServerType_Ws == msg.svrType)
|
||||
{
|
||||
assert(NULL != m_wsServer);
|
||||
m_wsServer->HandleMsg(&msg);
|
||||
}
|
||||
else if (ServerType_Http == msg.svrType)
|
||||
{
|
||||
assert(NULL != m_httpServer);
|
||||
m_httpServer->HandleMsg(&msg);
|
||||
}
|
||||
else if (ServerType_SockIo == msg.svrType)
|
||||
{
|
||||
assert(NULL != m_sockIoServer);
|
||||
m_sockIoServer->HandleMsg(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
HGBase_EnterLock(m_msgLock);
|
||||
if (m_listMsg.empty())
|
||||
{
|
||||
HGBase_ResetEvent(m_msgEvent);
|
||||
}
|
||||
HGBase_LeaveLock(m_msgLock);
|
||||
|
||||
if (WEB_MSGID_QUIT == msg.msgId)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Manager* MsgLoop::GetManager()
|
||||
{
|
||||
return m_manager;
|
||||
}
|
|
@ -1,481 +0,0 @@
|
|||
#include "WsUser.h"
|
||||
#include "WebServer.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "Manager.h"
|
||||
#include "base/HGInfo.h"
|
||||
#include "sha1.h"
|
||||
#include "base64.h"
|
||||
|
||||
#if defined(HG_CMP_MSC)
|
||||
WsUser::WsUser(class WebServer *server, HGUInt id, const char *ip, uint16_t port, SOCKET sockConn)
|
||||
#else
|
||||
WsUser::WsUser(class WebServer *server, HGUInt id, const char *ip, uint16_t port, int sockConn)
|
||||
#endif
|
||||
: WebUser(server, id, ip, port, sockConn)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
WsUser::~WsUser()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void WsUser::HandleCmd(const WsCmdParam* param)
|
||||
{
|
||||
// 解析param->data
|
||||
// 处理
|
||||
// SendResponse
|
||||
}
|
||||
|
||||
void WsUser::ThreadFunc()
|
||||
{
|
||||
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "WsUser::ThreadFunc");
|
||||
|
||||
char chBuffer[2048];
|
||||
const char* pBuffer = chBuffer;
|
||||
int nBufferSize = 0;
|
||||
bool bConnect = false;
|
||||
|
||||
unsigned char connectDataTail[4] = { '\r', '\n', '\r', '\n' };
|
||||
unsigned int connectDataTailLen = 0;
|
||||
std::string connectData;
|
||||
|
||||
uint8_t* pData = NULL;
|
||||
int nDataSize = 0;
|
||||
uint8_t* pDataEx = NULL;
|
||||
int nRemainSize = 0;
|
||||
uint8_t headData[20];
|
||||
uint32_t nHeadDataLen = 0;
|
||||
uint8_t vMask[4];
|
||||
uint32_t nMaskCount = 0;
|
||||
bool bHandle = false;
|
||||
std::vector<uint8_t> vAllData;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (0 == nBufferSize)
|
||||
{
|
||||
int len = recv(m_sockConn, chBuffer, 2048, 0);
|
||||
if (len <= 0)
|
||||
{
|
||||
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
pBuffer = chBuffer;
|
||||
nBufferSize = len;
|
||||
}
|
||||
}
|
||||
|
||||
assert(nBufferSize > 0);
|
||||
|
||||
if (!bConnect)
|
||||
{
|
||||
unsigned char b = *pBuffer;
|
||||
++pBuffer;
|
||||
--nBufferSize;
|
||||
|
||||
connectData.push_back(b);
|
||||
if (b == connectDataTail[connectDataTailLen])
|
||||
{
|
||||
++connectDataTailLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
connectDataTailLen = 0;
|
||||
if (b == connectDataTail[connectDataTailLen])
|
||||
{
|
||||
++connectDataTailLen;
|
||||
}
|
||||
}
|
||||
|
||||
if (4 == connectDataTailLen)
|
||||
{
|
||||
connectDataTailLen = 0;
|
||||
bool shakeRet = ShakeHand(connectData);
|
||||
connectData.clear();
|
||||
|
||||
if (!shakeRet)
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
|
||||
bConnect = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NULL == pData)
|
||||
{
|
||||
assert(0 == nDataSize);
|
||||
|
||||
uint8_t b = *pBuffer;
|
||||
++pBuffer;
|
||||
--nBufferSize;
|
||||
headData[nHeadDataLen] = b;
|
||||
++nHeadDataLen;
|
||||
|
||||
if (1 == nHeadDataLen)
|
||||
{
|
||||
if ((0x80 | 0x08) == headData[0]) // 断开连接
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
else if ((0x80 | 0x09) == headData[0]) // PING帧
|
||||
{
|
||||
//
|
||||
}
|
||||
else if ((0x80 | 0x0A) == headData[0]) // PONG帧
|
||||
{
|
||||
//
|
||||
}
|
||||
else if ((0x00 | 0x01) == headData[0] || (0x00 | 0x02) == headData[0] || (0x00 | 0x00) == headData[0] || (0x80 | 0x00) == headData[0]
|
||||
|| (0x80 | 0x01) == headData[0] || (0x80 | 0x02) == headData[0]) // 数据帧
|
||||
{
|
||||
if ((0x80 | 0x00) == headData[0] || (0x80 | 0x01) == headData[0] || (0x80 | 0x02) == headData[0])
|
||||
{
|
||||
// 分片结束
|
||||
bHandle = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 分片帧
|
||||
bHandle = false;
|
||||
}
|
||||
}
|
||||
else // 帧错误,断开连接
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (2 == nHeadDataLen)
|
||||
{
|
||||
if (0 == (headData[1] & 0x80)) // 必须经过掩码处理
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((0x80 | 0x09) == headData[0]) // PING帧
|
||||
{
|
||||
if (0x80 != headData[1])
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ((0x80 | 0x0A) == headData[0]) // PONG帧
|
||||
{
|
||||
if (0x80 != headData[1])
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((headData[1] & 0x7F) <= 125)
|
||||
{
|
||||
uint32_t nCmdSize = (headData[1] & 0x7F);
|
||||
nHeadDataLen = 0;
|
||||
|
||||
if (0 == nCmdSize)
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
|
||||
nDataSize = nCmdSize;
|
||||
nRemainSize = nCmdSize;
|
||||
pData = new uint8_t[nDataSize];
|
||||
pDataEx = pData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (4 == nHeadDataLen)
|
||||
{
|
||||
if ((0x80 | 0x09) == headData[0]) // PING帧
|
||||
{
|
||||
//
|
||||
}
|
||||
else if ((0x80 | 0x0A) == headData[0]) // PONG帧
|
||||
{
|
||||
//
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((headData[1] & 0x7F) == 126)
|
||||
{
|
||||
uint32_t nCmdSize = ntohs(*(uint16_t*)&headData[2]);
|
||||
nHeadDataLen = 0;
|
||||
|
||||
if (0 == nCmdSize)
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
|
||||
nDataSize = nCmdSize;
|
||||
nRemainSize = nCmdSize;
|
||||
pData = new uint8_t[nDataSize];
|
||||
pDataEx = pData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (6 == nHeadDataLen)
|
||||
{
|
||||
if ((0x80 | 0x09) == headData[0]) // PING帧
|
||||
{
|
||||
nHeadDataLen = 0;
|
||||
|
||||
Pong();
|
||||
}
|
||||
else if ((0x80 | 0x0A) == headData[0]) // PONG帧
|
||||
{
|
||||
nHeadDataLen = 0;
|
||||
}
|
||||
}
|
||||
else if (10 == nHeadDataLen)
|
||||
{
|
||||
if ((headData[1] & 0x7F) == 127) // 这里一定会等于127
|
||||
{
|
||||
uint32_t nCmdSizeHigh = ntohl(*(uint32_t*)&headData[2]);
|
||||
uint32_t nCmdSize = ntohl(*(uint32_t*)&headData[6]);
|
||||
nHeadDataLen = 0;
|
||||
|
||||
if ((0 != nCmdSizeHigh) || (0 == nCmdSize))
|
||||
{
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_DISCONNET;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = NULL;
|
||||
GetLoop()->Send(&msg);
|
||||
break;
|
||||
}
|
||||
|
||||
nDataSize = nCmdSize;
|
||||
nRemainSize = nCmdSize;
|
||||
pData = new uint8_t[nDataSize];
|
||||
pDataEx = pData;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (4 != nMaskCount)
|
||||
{
|
||||
uint8_t b = *pBuffer;
|
||||
++pBuffer;
|
||||
--nBufferSize;
|
||||
vMask[nMaskCount] = b;
|
||||
++nMaskCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
int nWriteSize = HGMIN(nBufferSize, nRemainSize);
|
||||
memcpy(pDataEx, pBuffer, nWriteSize);
|
||||
pBuffer += nWriteSize;
|
||||
nBufferSize -= nWriteSize;
|
||||
pDataEx += nWriteSize;
|
||||
nRemainSize -= nWriteSize;
|
||||
|
||||
if (0 == nRemainSize)
|
||||
{
|
||||
assert(pDataEx == pData + nDataSize);
|
||||
|
||||
for (int i = 0; i < nDataSize; ++i)
|
||||
{
|
||||
int j = i % 4;
|
||||
pData[i] = pData[i] ^ vMask[j];
|
||||
vAllData.push_back(pData[i]);
|
||||
}
|
||||
|
||||
delete[] pData;
|
||||
pData = NULL;
|
||||
nDataSize = 0;
|
||||
nMaskCount = 0;
|
||||
|
||||
if (bHandle)
|
||||
{
|
||||
WsCmdParam *param = new WsCmdParam;
|
||||
param->data = new HGByte [vAllData.size()];
|
||||
param->size = (HGUInt)vAllData.size();
|
||||
memcpy(param->data, &vAllData[0], vAllData.size());
|
||||
|
||||
WebMsg msg;
|
||||
msg.msgId = WEB_MSGID_WSCMD;
|
||||
msg.svrType = m_server->GetType();
|
||||
msg.usrId = m_id;
|
||||
msg.param = param;
|
||||
bool b = GetLoop()->Send(&msg);
|
||||
if (!b)
|
||||
{
|
||||
delete[] param->data;
|
||||
param->size = 0;
|
||||
delete param;
|
||||
}
|
||||
|
||||
bHandle = false;
|
||||
vAllData.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL != pData)
|
||||
{
|
||||
delete[] pData;
|
||||
pData = NULL;
|
||||
nDataSize = 0;
|
||||
nMaskCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool WsUser::ShakeHand(const std::string& head)
|
||||
{
|
||||
std::string requestMethod;
|
||||
std::string requestURIPath;
|
||||
HttpPairs requestURIQueryInfos;
|
||||
std::string requestURIFragment;
|
||||
std::string httpVersion;
|
||||
HttpPairs headInfos;
|
||||
HttpHead::AnalysisHead(head, requestMethod, requestURIPath, requestURIQueryInfos,
|
||||
requestURIFragment, httpVersion, headInfos);
|
||||
|
||||
if ("Upgrade" != HttpHead::GetValue(headInfos, "Connection"))
|
||||
return false;
|
||||
if ("websocket" != HttpHead::GetValue(headInfos, "Upgrade"))
|
||||
return false;
|
||||
|
||||
std::string key = HttpHead::GetValue(headInfos, "Sec-WebSocket-Key");
|
||||
if (key.empty())
|
||||
return false;
|
||||
|
||||
key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||||
|
||||
unsigned int message_digest[5];
|
||||
SHA1 sha;
|
||||
sha.Reset();
|
||||
sha << key.c_str();
|
||||
sha.Result(message_digest);
|
||||
|
||||
for (int i = 0; i < 5; ++i)
|
||||
message_digest[i] = htonl(message_digest[i]);
|
||||
std::string serverKey = base64_encode((const unsigned char*)message_digest, 20);
|
||||
|
||||
std::string handShakeResp = "HTTP/1.1 101 Switching Protocols\r\n";
|
||||
handShakeResp += "Upgrade: websocket\r\n";
|
||||
handShakeResp += "Connection: Upgrade\r\n";
|
||||
handShakeResp += "Sec-WebSocket-Accept:";
|
||||
handShakeResp += serverKey;
|
||||
handShakeResp += "\r\n\r\n";
|
||||
send(m_sockConn, handShakeResp.c_str(), (int)handShakeResp.length(), 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
void WsUser::Pong()
|
||||
{
|
||||
uint8_t vHead[2];
|
||||
vHead[0] = 0x80 | 0x0A;
|
||||
vHead[1] = 0;
|
||||
|
||||
HGBase_EnterLock(m_cs);
|
||||
send(m_sockConn, (const char *)vHead, 2, 0);
|
||||
HGBase_LeaveLock(m_cs);
|
||||
}
|
||||
|
||||
bool WsUser::SendResponse(const HGByte* data, HGUInt size, HGBool text)
|
||||
{
|
||||
if (NULL == data || 0 == size)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t nHeadLen = 0;
|
||||
|
||||
uint8_t vHead[20] = { 0 };
|
||||
vHead[0] = text ? (0x80 | 0x01) : (0x80 | 0x02);
|
||||
if (size <= 125)
|
||||
{
|
||||
vHead[1] = (uint8_t)size;
|
||||
nHeadLen = 2;
|
||||
}
|
||||
else if (size <= 0xFFFF)
|
||||
{
|
||||
vHead[1] = 126;
|
||||
uint16_t payloadLength16b = htons((uint16_t)size);
|
||||
memcpy(&vHead[2], &payloadLength16b, 2);
|
||||
nHeadLen = 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
vHead[1] = 127;
|
||||
vHead[2] = 0;
|
||||
vHead[3] = 0;
|
||||
vHead[4] = 0;
|
||||
vHead[5] = 0;
|
||||
uint32_t payloadLength32b = htonl(size);
|
||||
memcpy(&vHead[6], &payloadLength32b, 4);
|
||||
nHeadLen = 10;
|
||||
}
|
||||
|
||||
HGBase_EnterLock(m_cs);
|
||||
send(m_sockConn, (const char*)vHead, nHeadLen, 0);
|
||||
send(m_sockConn, (const char*)data, size, 0);
|
||||
HGBase_LeaveLock(m_cs);
|
||||
return true;
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
#ifndef __WSUSER_H__
|
||||
#define __WSUSER_H__
|
||||
|
||||
#include "WebMsg.h"
|
||||
#include "WebUser.h"
|
||||
|
||||
class WsUser : public WebUser
|
||||
{
|
||||
public:
|
||||
#if defined(HG_CMP_MSC)
|
||||
WsUser(class WebServer *server, HGUInt id, const char *ip, uint16_t port, SOCKET sockConn);
|
||||
#else
|
||||
WsUser(class WebServer*server, HGUInt id, const char *ip, uint16_t port, int sockConn);
|
||||
#endif
|
||||
virtual ~WsUser();
|
||||
|
||||
void HandleCmd(const WsCmdParam* param);
|
||||
|
||||
protected:
|
||||
virtual void ThreadFunc();
|
||||
|
||||
private:
|
||||
bool ShakeHand(const std::string& head);
|
||||
void Pong();
|
||||
bool SendResponse(const HGByte* data, HGUInt size, HGBool text);
|
||||
};
|
||||
|
||||
#endif /* __WSUSER_H__ */
|
|
@ -1,15 +1,30 @@
|
|||
#include "base/HGDef.h"
|
||||
#include "base/HGInc.h"
|
||||
#include "base/HGThread.h"
|
||||
#include "MsgLoop.h"
|
||||
#include "base/HGUtility.h"
|
||||
#include "1.0/MsgLoop.h"
|
||||
#include "2.0/MsgPump.h"
|
||||
|
||||
static void ThreadFunc(HGThread thread, HGPointer param)
|
||||
{
|
||||
(void)thread;
|
||||
(void)param;
|
||||
|
||||
MsgLoop* loop = (MsgLoop*)param;
|
||||
loop->Loop();
|
||||
HGChar cfgPath[256];
|
||||
HGBase_GetConfigPath(cfgPath, 256);
|
||||
strcat(cfgPath, "config.ini");
|
||||
|
||||
HGInt verNum = 2;
|
||||
HGBase_GetProfileInt(cfgPath, "version", "verNum", 2, &verNum);
|
||||
if (1 == verNum) // 使用1.0版本接口
|
||||
{
|
||||
MsgLoop loop;
|
||||
loop.Loop();
|
||||
}
|
||||
else // 使用2.0版本接口
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HG_CMP_MSC)
|
||||
|
@ -24,9 +39,8 @@ int main()
|
|||
assert(0 == ret);
|
||||
#endif
|
||||
|
||||
MsgLoop loop;
|
||||
HGThread thread = NULL;
|
||||
HGBase_OpenThread(ThreadFunc, &loop, &thread);
|
||||
HGBase_OpenThread(ThreadFunc, NULL, &thread);
|
||||
HGBase_CloseThread(thread);
|
||||
thread = NULL;
|
||||
|
||||
|
|
Loading…
Reference in New Issue