HGGitLab

Commit ddf01936 authored by luoliangyi's avatar luoliangyi

解析socket.io协议

parent c15badd2
......@@ -39,8 +39,12 @@
#endif
#if defined(HG_CMP_MSC)
#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#endif
/* type defines */
......
......@@ -28,6 +28,7 @@
<ClCompile Include="..\..\..\sdk\webservice\WebUser.cpp" />
<ClCompile Include="..\..\..\sdk\webservice\WsUser.cpp" />
<ClCompile Include="..\..\..\third_party\base64\base64.cpp" />
<ClCompile Include="..\..\..\third_party\json\cJSON.c" />
<ClCompile Include="..\..\..\third_party\sha1\sha1.cpp" />
</ItemGroup>
<ItemGroup>
......@@ -40,6 +41,7 @@
<ClInclude Include="..\..\..\sdk\webservice\WebUser.h" />
<ClInclude Include="..\..\..\sdk\webservice\WsUser.h" />
<ClInclude Include="..\..\..\third_party\base64\base64.h" />
<ClInclude Include="..\..\..\third_party\json\cJSON.h" />
<ClInclude Include="..\..\..\third_party\sha1\sha1.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
......@@ -110,15 +112,15 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;SDK_USE_TWAIN;ZIP_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../Debug/HGTwainUser.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../Debug/HGTwainUser.lib;../../../release/lib/windows/x86/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/ignore:4098,4075 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
......@@ -128,17 +130,17 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;SDK_USE_TWAIN;ZIP_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGTwainUser.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGTwainUser.lib;../../../release/lib/windows/x86/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
......@@ -149,10 +151,10 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;SDK_USE_TWAIN;ZIP_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
......@@ -167,10 +169,10 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;SDK_USE_TWAIN;ZIP_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../release/include/;../../../third_party/sane/;../../../third_party/libzip/windows/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
......
......@@ -39,8 +39,12 @@
#endif
#if defined(HG_CMP_MSC)
#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#endif
/* type defines */
......
......@@ -2,8 +2,10 @@
#include "WebServer.h"
#include "Manager.h"
#include "../../base/HGInfo.h"
#include "../../base/HGUtility.h"
#include "sha1.h"
#include "base64.h"
#include "cJSON.h"
extern Manager* g_manager;
......@@ -24,9 +26,38 @@ SockIoUser::~SockIoUser()
void SockIoUser::HandleCmd(const SockIoCmdParam* param)
{
// 解析param->data
// 处理
// SendResponse
std::string user;
std::string data;
GetMsgInfo(param, user, data);
if ("scan" == user)
{
std::string imgName;
bool insert = false;
cJSON* json = cJSON_Parse(data.c_str());
if (NULL != json)
{
if (NULL != json->child && 0 == strcmp("imageName", json->child->string)
&& cJSON_String == json->child->type)
{
imgName = json->child->valuestring;
if (NULL != json->child->next && 0 == strcmp("isInsert", json->child->next->string)
&& cJSON_True == json->child->next->type)
insert = true;
}
cJSON_Delete(json);
}
std::string resp = "42[\"error\", \"device error\"]";
SendResponse((const HGByte *)resp.c_str(), (HGUInt)resp.size(), HGTRUE);
}
else if ("stop" == user)
{
std::string resp = "42[\"error\", \"device error\"]";
SendResponse((const HGByte*)resp.c_str(), (HGUInt)resp.size(), HGTRUE);
}
}
void SockIoUser::ThreadFunc()
......@@ -338,21 +369,30 @@ void SockIoUser::ThreadFunc()
if (bHandle)
{
SockIoCmdParam* param = new SockIoCmdParam;
param->data = new HGByte[vAllData.size()];
param->size = (HGUInt)vAllData.size();
memcpy(param->data, &vAllData[0], vAllData.size());
WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIOCMD;
msg.userId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
if (!b)
if (1 == vAllData.size() && '2' == vAllData[0])
{
delete[] param->data;
param->size = 0;
delete param;
// socket.io pong
char data = '3';
SendResponse((const HGByte*)&data, 1, HGTRUE);
}
else
{
SockIoCmdParam* param = new SockIoCmdParam;
param->data = new HGByte[vAllData.size()];
param->size = (HGUInt)vAllData.size();
memcpy(param->data, &vAllData[0], vAllData.size());
WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIOCMD;
msg.userId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
if (!b)
{
delete[] param->data;
param->size = 0;
delete param;
}
}
bHandle = false;
......@@ -373,6 +413,39 @@ void SockIoUser::ThreadFunc()
}
}
void SockIoUser::GetMsgInfo(const SockIoCmdParam* param, std::string& user, std::string& data)
{
user.clear();
data.clear();
std::string paramStr((const char *)param->data, param->size);
size_t pos = paramStr.find('[');
if (std::string::npos == pos)
{
return;
}
std::string msgType = paramStr.substr(0, pos);
if ("42" != msgType)
{
return;
}
std::string msgInfo = paramStr.substr(pos);
cJSON* json = cJSON_Parse(msgInfo.c_str());
if (NULL != json)
{
if (NULL != json->child)
{
user = json->child->valuestring;
if (NULL != json->child->next)
data = json->child->next->valuestring;
}
cJSON_Delete(json);
}
}
bool SockIoUser::ShakeHand(const std::string& head)
{
std::string requestMethod;
......@@ -391,23 +464,57 @@ bool SockIoUser::ShakeHand(const std::string& head)
if ("websocket" != HttpHead::GetValue(headInfos, "Upgrade"))
return false;
char respHead[512];
sprintf(respHead, "HTTP/1.1 101 Switching Protocols\r\n\r\n");
send(m_sockConn, respHead, (int)strlen(respHead), 0);
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);
char uuid[256] = {0};
HGBase_GetUuid(uuid, 256);
std::string resp = "0{";
resp += "\"sid\":\"Peed250dk55pprwgAAAA\",";
resp += "\"sid\":\"";
resp += uuid;
resp += "\",";
resp += "\"upgrades\":[\"websocket\"],";
resp += "\"pingInterval\":25000,";
resp += "\"pingTimeout\":60000";
resp += "}";
SendResponse((const HGByte*)resp.c_str(), (int)resp.size(), HGTRUE);
resp = "40";
SendResponse((const HGByte*)resp.c_str(), (int)resp.size(), HGTRUE);
return true;
}
void SockIoUser::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 SockIoUser::SendResponse(const HGByte* data, HGUInt size, HGBool text)
......
......@@ -20,6 +20,7 @@ protected:
virtual void ThreadFunc();
private:
static void GetMsgInfo(const SockIoCmdParam* param, std::string &user, std::string& data);
bool ShakeHand(const std::string& head);
void Pong();
bool SendResponse(const HGByte* data, HGUInt size, HGBool text);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment