整理websdk目录,重理类的继承关系

This commit is contained in:
luoliangyi 2022-05-21 14:34:02 +08:00
parent fd0e1f82bd
commit 6cc1cfddfb
24 changed files with 408 additions and 892 deletions

View File

@ -19,30 +19,32 @@
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\..\sdk\webservice\HttpHead.cpp" /> <ClCompile Include="..\..\..\sdk\webservice\1.0\HttpHead.cpp" />
<ClCompile Include="..\..\..\sdk\webservice\HttpUser.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\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\base64\base64.cpp" />
<ClCompile Include="..\..\..\third_party\json\cJSON.c" /> <ClCompile Include="..\..\..\third_party\json\cJSON.c" />
<ClCompile Include="..\..\..\third_party\sha1\sha1.cpp" /> <ClCompile Include="..\..\..\third_party\sha1\sha1.cpp" />
<ClCompile Include="..\..\..\utility\HGString.cpp" /> <ClCompile Include="..\..\..\utility\HGString.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\sdk\webservice\HttpHead.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\HttpHead.h" />
<ClInclude Include="..\..\..\sdk\webservice\HttpUser.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\HttpUser.h" />
<ClInclude Include="..\..\..\sdk\webservice\Manager.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\Manager.h" />
<ClInclude Include="..\..\..\sdk\webservice\MsgLoop.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\MsgLoop.h" />
<ClInclude Include="..\..\..\sdk\webservice\SockIoUser.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\SockIoServer.h" />
<ClInclude Include="..\..\..\sdk\webservice\WebMsg.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\SockIoUser.h" />
<ClInclude Include="..\..\..\sdk\webservice\WebServer.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\WebMsg.h" />
<ClInclude Include="..\..\..\sdk\webservice\WebUser.h" /> <ClInclude Include="..\..\..\sdk\webservice\1.0\HttpServer.h" />
<ClInclude Include="..\..\..\sdk\webservice\WsUser.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\base64\base64.h" />
<ClInclude Include="..\..\..\third_party\json\cJSON.h" /> <ClInclude Include="..\..\..\third_party\json\cJSON.h" />
<ClInclude Include="..\..\..\third_party\sha1\sha1.h" /> <ClInclude Include="..\..\..\third_party\sha1\sha1.h" />
@ -120,6 +122,7 @@
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <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> <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> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -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);
}
}

View File

@ -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__ */

View File

@ -1,5 +1,4 @@
#include "HttpUser.h" #include "HttpUser.h"
#include "WebServer.h"
#include "MsgLoop.h" #include "MsgLoop.h"
#include "Manager.h" #include "Manager.h"
#include "base/HGInfo.h" #include "base/HGInfo.h"
@ -744,7 +743,7 @@ void HttpUser::ThreadFunc()
// 这里跳出可能是服务器关闭了socketConn或者客户端关闭了socket或者网络断开 // 这里跳出可能是服务器关闭了socketConn或者客户端关闭了socket或者网络断开
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -786,7 +785,7 @@ void HttpUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -810,8 +809,8 @@ void HttpUser::ThreadFunc()
param->size = 0; param->size = 0;
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_HTTPCMD; msg.msgId = WEB_MSGID_COMMAND;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = param; msg.param = param;
bool b = GetLoop()->Send(&msg); bool b = GetLoop()->Send(&msg);
@ -837,8 +836,8 @@ void HttpUser::ThreadFunc()
memcpy(param->data, data, dataSize); memcpy(param->data, data, dataSize);
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_HTTPCMD; msg.msgId = WEB_MSGID_COMMAND;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = param; msg.param = param;
bool b = GetLoop()->Send(&msg); bool b = GetLoop()->Send(&msg);

View File

@ -1,8 +1,8 @@
#ifndef __HTTPUSER_H__ #ifndef __HTTPUSER_H__
#define __HTTPUSER_H__ #define __HTTPUSER_H__
#include "WebMsg.h"
#include "WebUser.h" #include "WebUser.h"
#include "WebMsg.h"
class HttpUser : public WebUser class HttpUser : public WebUser
{ {

View File

@ -1896,7 +1896,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_OPENDEV; msg.msgId = WEB_MSGID_OPENDEV;
msg.svrType = 0; msg.svr = NULL;
msg.usrId = 0; msg.usrId = 0;
msg.param = openDevParam; msg.param = openDevParam;
bool b = p->m_loop->Send(&msg); 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; WebMsg msg;
msg.msgId = WEB_MSGID_CLOSEDEV; msg.msgId = WEB_MSGID_CLOSEDEV;
msg.svrType = 0; msg.svr = NULL;
msg.usrId = 0; msg.usrId = 0;
msg.param = closeDevParam; msg.param = closeDevParam;
bool b = p->m_loop->Send(&msg); 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; WebMsg msg;
msg.msgId = WEB_MSGID_SCANFINISH; msg.msgId = WEB_MSGID_SCANFINISH;
msg.svrType = 0; msg.svr = NULL;
msg.usrId = 0; msg.usrId = 0;
msg.param = NULL; msg.param = NULL;
p->m_loop->Send(&msg); p->m_loop->Send(&msg);

View File

@ -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();
}

View File

@ -7,7 +7,8 @@
#include "base/HGLock.h" #include "base/HGLock.h"
#include "WebMsg.h" #include "WebMsg.h"
#include "Manager.h" #include "Manager.h"
#include "WebServer.h" #include "HttpServer.h"
#include "SockIoServer.h"
#include <list> #include <list>
class MsgLoop class MsgLoop
@ -18,7 +19,6 @@ public:
bool Send(const WebMsg* msg); bool Send(const WebMsg* msg);
void Loop(); void Loop();
Manager* GetManager();
private: private:
HGEvent m_msgEvent; HGEvent m_msgEvent;
@ -27,9 +27,8 @@ private:
std::list<WebMsg> m_listMsg; std::list<WebMsg> m_listMsg;
Manager *m_manager; Manager *m_manager;
WebServer *m_httpServer; HttpServer *m_httpServer;
WebServer *m_sockIoServer; SockIoServer *m_sockIoServer;
WebServer* m_wsServer;
}; };
#endif /* __MSGLOOP_H__ */ #endif /* __MSGLOOP_H__ */

View File

@ -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);
}
}

View File

@ -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__ */

View File

@ -1,5 +1,4 @@
#include "SockIoUser.h" #include "SockIoUser.h"
#include "WebServer.h"
#include "MsgLoop.h" #include "MsgLoop.h"
#include "Manager.h" #include "Manager.h"
#include "base/HGInfo.h" #include "base/HGInfo.h"
@ -9,9 +8,9 @@
#include "cJSON.h" #include "cJSON.h"
#if defined(HG_CMP_MSC) #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 #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 #endif
: WebUser(server, id, ip, port, sockConn) : 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); SendResponse(param->data, param->size, HGTRUE);
} }
@ -109,7 +108,7 @@ void SockIoUser::ThreadFunc()
// 这里跳出可能是服务器关闭了socketConn或者客户端关闭了socket或者网络断开 // 这里跳出可能是服务器关闭了socketConn或者客户端关闭了socket或者网络断开
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -154,7 +153,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -182,7 +181,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -214,7 +213,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -227,7 +226,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -240,7 +239,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -253,7 +252,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -271,7 +270,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -306,7 +305,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -345,7 +344,7 @@ void SockIoUser::ThreadFunc()
{ {
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET; msg.msgId = WEB_MSGID_DISCONNET;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = NULL; msg.param = NULL;
GetLoop()->Send(&msg); GetLoop()->Send(&msg);
@ -410,8 +409,8 @@ void SockIoUser::ThreadFunc()
memcpy(param->data, &vAllData[0], vAllData.size()); memcpy(param->data, &vAllData[0], vAllData.size());
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIOCMD; msg.msgId = WEB_MSGID_COMMAND;
msg.svrType = m_server->GetType(); msg.svr = m_server;
msg.usrId = m_id; msg.usrId = m_id;
msg.param = param; msg.param = param;
bool b = GetLoop()->Send(&msg); bool b = GetLoop()->Send(&msg);
@ -480,14 +479,14 @@ void SockIoUser::ScanCallback(HGUInt event, void* value1, void* value2, void* pa
if (NULL != resp) if (NULL != resp)
{ {
SockIoRetParam* param = new SockIoRetParam; SockIoEvtParam* param = new SockIoEvtParam;
param->data = new HGByte[strlen(resp)]; param->data = new HGByte[strlen(resp)];
param->size = (HGUInt)strlen(resp); param->size = (HGUInt)strlen(resp);
memcpy(param->data, resp, strlen(resp)); memcpy(param->data, resp, strlen(resp));
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIORET; msg.msgId = WEB_MSGID_EVENT;
msg.svrType = p->m_server->GetType(); msg.svr = p->m_server;
msg.usrId = p->m_id; msg.usrId = p->m_id;
msg.param = param; msg.param = param;
bool b = p->GetLoop()->Send(&msg); bool b = p->GetLoop()->Send(&msg);

View File

@ -1,21 +1,21 @@
#ifndef __SOCKIOUSER_H__ #ifndef __SOCKIOUSER_H__
#define __SOCKIOUSER_H__ #define __SOCKIOUSER_H__
#include "WebMsg.h"
#include "WebUser.h" #include "WebUser.h"
#include "WebMsg.h"
class SockIoUser : public WebUser class SockIoUser : public WebUser
{ {
public: public:
#if defined(HG_CMP_MSC) #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 #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 #endif
virtual ~SockIoUser(); virtual ~SockIoUser();
void HandleCmd(const SockIoCmdParam* param); void HandleCmd(const SockIoCmdParam* param);
void HandleRet(const SockIoRetParam* param); void HandleEvent(const SockIoEvtParam* param);
protected: protected:
virtual void ThreadFunc(); virtual void ThreadFunc();

View File

@ -6,23 +6,22 @@
#include "HttpHead.h" #include "HttpHead.h"
#include <string> #include <string>
#define WEB_MSGID_QUIT 1 enum WebMsgId
#define WEB_MSGID_CONNET 2 {
#define WEB_MSGID_DISCONNET 3 WEB_MSGID_QUIT = 1,
#define WEB_MSGID_WSCMD 4 WEB_MSGID_CONNET,
#define WEB_MSGID_HTTPCMD 5 WEB_MSGID_DISCONNET,
#define WEB_MSGID_SOCKIOCMD 6 WEB_MSGID_COMMAND,
#define WEB_MSGID_WSRET 7 WEB_MSGID_EVENT,
#define WEB_MSGID_HTTPRET 8 WEB_MSGID_OPENDEV,
#define WEB_MSGID_SOCKIORET 9 WEB_MSGID_CLOSEDEV,
#define WEB_MSGID_OPENDEV 10 WEB_MSGID_SCANFINISH
#define WEB_MSGID_CLOSEDEV 11 };
#define WEB_MSGID_SCANFINISH 12
struct WebMsg struct WebMsg
{ {
HGUInt msgId; /* WEB_MSGID_** */ HGUInt msgId; /* WEB_MSGID_** */
HGUInt svrType; /* svrType */ HGPointer svr; /* server */
HGUInt usrId; /* usrId */ HGUInt usrId; /* usrId */
HGPointer param; /* param */ HGPointer param; /* param */
}; };
@ -38,12 +37,6 @@ struct ConnectParam
#endif #endif
}; };
struct WsCmdParam
{
HGByte *data;
HGUInt size;
};
struct HttpCmdParam struct HttpCmdParam
{ {
HttpHead head; HttpHead head;
@ -57,7 +50,7 @@ struct SockIoCmdParam
HGUInt size; HGUInt size;
}; };
struct SockIoRetParam struct SockIoEvtParam
{ {
HGByte* data; HGByte* data;
HGUInt size; HGUInt size;

View File

@ -1,14 +1,12 @@
#include "WebServer.h" #include "WebServer.h"
#include "WebUser.h"
#include "MsgLoop.h" #include "MsgLoop.h"
#include "WsUser.h"
#include "HttpUser.h"
#include "SockIoUser.h"
#include "base/HGInfo.h" #include "base/HGInfo.h"
WebServer::WebServer(class MsgLoop* loop, HGUInt type) WebServer::WebServer(class MsgLoop* loop, class Manager* manager)
{ {
m_loop = loop; m_loop = loop;
m_type = type; m_manager = manager;
m_currUserId = 1; m_currUserId = 1;
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
@ -29,9 +27,9 @@ class MsgLoop* WebServer::GetLoop()
return m_loop; return m_loop;
} }
HGUInt WebServer::GetType() class Manager* WebServer::GetManager()
{ {
return m_type; return m_manager;
} }
bool WebServer::Open(HGUShort port) bool WebServer::Open(HGUShort port)
@ -111,7 +109,7 @@ bool WebServer::Close()
return false; return false;
} }
while (!m_vectorUser.empty()) while (!m_vectorUser.empty())
{ {
WebUser* pUser = m_vectorUser[0]; WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin()); m_vectorUser.erase(m_vectorUser.begin());
@ -131,113 +129,17 @@ bool WebServer::Close()
return true; return true;
} }
void WebServer::HandleMsg(const WebMsg* msg) void WebServer::DisConnect(HGUInt usrId)
{ {
assert(NULL != msg); assert(0 != usrId);
assert(msg->svrType == m_type);
if (WEB_MSGID_CONNET == msg->msgId) int nIndex = GetUserIndex(usrId);
if (-1 != nIndex)
{ {
assert(0 == msg->usrId); WebUser* pUser = m_vectorUser[nIndex];
ConnectParam* param = (ConnectParam*)msg->param; m_vectorUser.erase(m_vectorUser.begin() + nIndex);
assert(NULL != param); delete pUser;
pUser = NULL;
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);
if (-1 != nIndex)
{
WebUser* pUser = m_vectorUser[nIndex];
m_vectorUser.erase(m_vectorUser.begin() + nIndex);
delete pUser;
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;
} }
} }
@ -274,7 +176,7 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
if (-1 == socketConn) if (-1 == socketConn)
#endif #endif
{ {
// 这里跳出可能是服务器关闭了m_sockServer // 这里跳出可能是服务器关闭了m_sockServer
break; break;
} }
@ -285,7 +187,7 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
WebMsg msg; WebMsg msg;
msg.msgId = WEB_MSGID_CONNET; msg.msgId = WEB_MSGID_CONNET;
msg.svrType = p->m_type; msg.svr = p;
msg.usrId = 0; msg.usrId = 0;
msg.param = param; msg.param = param;
bool b = p->m_loop->Send(&msg); bool b = p->m_loop->Send(&msg);
@ -299,4 +201,4 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
#endif #endif
} }
} }
} }

View File

@ -1,4 +1,4 @@
#ifndef __WEBSERVER_H__ #ifndef __WEBSERVER_H__
#define __WEBSERVER_H__ #define __WEBSERVER_H__
#include "base/HGDef.h" #include "base/HGDef.h"
@ -7,30 +7,28 @@
#include "WebMsg.h" #include "WebMsg.h"
#include <vector> #include <vector>
#define ServerType_Ws 1L
#define ServerType_Http 2L
#define ServerType_SockIo 3L
class WebServer class WebServer
{ {
public: public:
WebServer(class MsgLoop *loop, HGUInt type); WebServer(class MsgLoop* loop, class Manager* manager);
~WebServer(); virtual ~WebServer();
class MsgLoop* GetLoop(); class MsgLoop* GetLoop();
HGUInt GetType(); class Manager* GetManager();
bool Open(HGUShort port); bool Open(HGUShort port);
bool Close(); bool Close();
void HandleMsg(const WebMsg* msg);
private: virtual void Connect(const ConnectParam* param) = 0;
void DisConnect(HGUInt usrId);
protected:
int GetUserIndex(HGUInt id); int GetUserIndex(HGUInt id);
static void ThreadFunc(HGThread thread, HGPointer param); static void ThreadFunc(HGThread thread, HGPointer param);
private: protected:
class MsgLoop* m_loop; class MsgLoop* m_loop;
HGUInt m_type; class Manager* m_manager;
HGUInt m_currUserId; HGUInt m_currUserId;
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)

View File

@ -1,6 +1,5 @@
#include "WebUser.h" #include "WebUser.h"
#include "WebServer.h" #include "WebServer.h"
#include "MsgLoop.h"
#include "base/HGInfo.h" #include "base/HGInfo.h"
#if defined(HG_CMP_MSC) #if defined(HG_CMP_MSC)
@ -56,7 +55,7 @@ class MsgLoop* WebUser::GetLoop()
class Manager* WebUser::GetManager() class Manager* WebUser::GetManager()
{ {
return m_server->GetLoop()->GetManager(); return m_server->GetManager();
} }
void WebUser::ThreadFunc() void WebUser::ThreadFunc()

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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__ */

View File

@ -1,15 +1,30 @@
#include "base/HGDef.h" #include "base/HGDef.h"
#include "base/HGInc.h" #include "base/HGInc.h"
#include "base/HGThread.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) static void ThreadFunc(HGThread thread, HGPointer param)
{ {
(void)thread; (void)thread;
(void)param; (void)param;
MsgLoop* loop = (MsgLoop*)param; HGChar cfgPath[256];
loop->Loop(); 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) #if defined(HG_CMP_MSC)
@ -24,9 +39,8 @@ int main()
assert(0 == ret); assert(0 == ret);
#endif #endif
MsgLoop loop;
HGThread thread = NULL; HGThread thread = NULL;
HGBase_OpenThread(ThreadFunc, &loop, &thread); HGBase_OpenThread(ThreadFunc, NULL, &thread);
HGBase_CloseThread(thread); HGBase_CloseThread(thread);
thread = NULL; thread = NULL;