整理websdk目录,重理类的继承关系
This commit is contained in:
parent
fd0e1f82bd
commit
6cc1cfddfb
|
@ -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>
|
||||||
|
|
|
@ -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 "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);
|
|
@ -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
|
||||||
{
|
{
|
|
@ -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);
|
|
@ -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 "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__ */
|
|
@ -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 "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);
|
|
@ -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();
|
|
@ -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;
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)
|
|
@ -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()
|
|
@ -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/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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue