2022-05-24 02:01:36 +00:00
|
|
|
|
#include "WebServer.h"
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#include "WebUser.h"
|
|
|
|
|
#include "base/HGInfo.h"
|
2023-03-20 13:03:28 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
|
|
|
|
#include <shellapi.h>
|
|
|
|
|
extern ULONG taskbarMsgId;
|
|
|
|
|
extern NOTIFYICONDATAA nid;
|
|
|
|
|
#endif
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
WebServer::WebServer(HGMsgPump msgPump)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
{
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_msgPump = msgPump;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_currUserId = 1;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_sockServer = INVALID_SOCKET;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_sockServer = -1;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_listenThread = NULL;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
WebServer::~WebServer()
|
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
HGMsgPump WebServer::GetMsgPump()
|
|
|
|
|
{
|
|
|
|
|
return m_msgPump;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
bool WebServer::Open(HGUShort port)
|
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
if (INVALID_SOCKET != m_sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
if (-1 != m_sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
|
if (INVALID_SOCKET == sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
int sockServer = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
|
if (-1 == sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
2022-10-27 09:17:04 +00:00
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 1, port=%u", port);
|
2022-05-23 10:29:23 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
// bind
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
SOCKADDR_IN addrServer;
|
|
|
|
|
addrServer.sin_addr.S_un.S_addr = INADDR_ANY;
|
|
|
|
|
addrServer.sin_family = AF_INET;
|
|
|
|
|
addrServer.sin_port = htons(port);
|
|
|
|
|
if (0 != bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR_IN)))
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
struct sockaddr_in addrServer;
|
|
|
|
|
addrServer.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
|
addrServer.sin_family = AF_INET;
|
|
|
|
|
addrServer.sin_port = htons(port);
|
|
|
|
|
if (0 != bind(sockServer, (struct sockaddr*)&addrServer, sizeof(addrServer)))
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
closesocket(sockServer);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
close(sockServer);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-10-27 09:17:04 +00:00
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 2, port=%u", port);
|
2022-05-23 10:29:23 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
// listen
|
|
|
|
|
if (0 != listen(sockServer, 5))
|
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
closesocket(sockServer);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
close(sockServer);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-10-27 09:17:04 +00:00
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 3, port=%u", port);
|
2022-05-23 10:29:23 +00:00
|
|
|
|
return false;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
m_sockServer = sockServer;
|
|
|
|
|
HGBase_OpenThread(ThreadFunc, this, &m_listenThread);
|
|
|
|
|
assert(NULL != m_listenThread);
|
|
|
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver success, port=%u", port);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool WebServer::Close()
|
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
if (INVALID_SOCKET == m_sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
if (-1 == m_sockServer)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
while (!m_vectorUser.empty())
|
|
|
|
|
{
|
|
|
|
|
WebUser* pUser = m_vectorUser[0];
|
|
|
|
|
m_vectorUser.erase(m_vectorUser.begin());
|
|
|
|
|
delete pUser;
|
|
|
|
|
pUser = NULL;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
closesocket(m_sockServer);
|
|
|
|
|
m_sockServer = INVALID_SOCKET;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
close(m_sockServer);
|
|
|
|
|
m_sockServer = -1;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
HGBase_CloseThread(m_listenThread);
|
|
|
|
|
m_listenThread = NULL;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
void WebServer::DisConnect(const DisConnectParam* param)
|
|
|
|
|
{
|
|
|
|
|
assert(NULL != param && this == param->svr);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
int nIndex = GetUserIndex(param->usrId);
|
|
|
|
|
if (-1 != nIndex)
|
|
|
|
|
{
|
|
|
|
|
WebUser* pUser = m_vectorUser[nIndex];
|
|
|
|
|
m_vectorUser.erase(m_vectorUser.begin() + nIndex);
|
|
|
|
|
delete pUser;
|
|
|
|
|
pUser = NULL;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
2023-03-20 13:03:28 +00:00
|
|
|
|
|
|
|
|
|
#if defined(HG_CMP_MSC)
|
|
|
|
|
if (m_vectorUser.empty())
|
|
|
|
|
{
|
|
|
|
|
lstrcpyA(nid.szTip, "扫描服务程序(未连接)");
|
|
|
|
|
Shell_NotifyIconA(NIM_MODIFY, &nid);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, SOCKET sockConn)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, int sockConn)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
|
|
|
|
ConnectParam* param = new ConnectParam;
|
|
|
|
|
param->svr = this;
|
|
|
|
|
param->ip = ip;
|
|
|
|
|
param->port = port;
|
|
|
|
|
param->socket = sockConn;
|
|
|
|
|
|
|
|
|
|
HGMsg msg;
|
|
|
|
|
msg.id = MSGID_CONNECT;
|
|
|
|
|
msg.data = param;
|
|
|
|
|
if (HGBASE_ERR_OK != HGBase_PostPumpMessage(m_msgPump, &msg))
|
2022-05-23 02:35:42 +00:00
|
|
|
|
{
|
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
closesocket(param->socket);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
close(param->socket);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
delete param;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
2022-05-23 10:29:23 +00:00
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
int WebServer::GetUserIndex(HGUInt id)
|
|
|
|
|
{
|
|
|
|
|
int nIndex = -1;
|
|
|
|
|
for (int i = 0; i < (int)m_vectorUser.size(); ++i)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
{
|
2022-05-23 10:29:23 +00:00
|
|
|
|
if (id == m_vectorUser[i]->GetId())
|
2022-05-23 02:35:42 +00:00
|
|
|
|
{
|
2022-05-23 10:29:23 +00:00
|
|
|
|
nIndex = i;
|
|
|
|
|
break;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-23 10:29:23 +00:00
|
|
|
|
return nIndex;
|
|
|
|
|
}
|
2022-05-23 02:35:42 +00:00
|
|
|
|
|
2022-10-12 03:35:09 +00:00
|
|
|
|
void HGAPI WebServer::ThreadFunc(HGThread thread, HGPointer param)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
|
|
|
|
WebServer* p = (WebServer*)param;
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#if defined(HG_CMP_MSC)
|
2022-05-23 10:29:23 +00:00
|
|
|
|
SOCKADDR_IN addrClient;
|
|
|
|
|
int len = sizeof(SOCKADDR_IN);
|
|
|
|
|
SOCKET socketConn = accept(p->m_sockServer, (SOCKADDR*)&addrClient, &len);
|
|
|
|
|
if (INVALID_SOCKET == socketConn)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#else
|
2022-05-23 10:29:23 +00:00
|
|
|
|
struct sockaddr_in addrClient;
|
|
|
|
|
socklen_t len = sizeof(addrClient);
|
|
|
|
|
int socketConn = accept(p->m_sockServer, (struct sockaddr*)&addrClient, &len);
|
|
|
|
|
if (-1 == socketConn)
|
2022-05-23 02:35:42 +00:00
|
|
|
|
#endif
|
2022-05-23 10:29:23 +00:00
|
|
|
|
{
|
2022-05-24 02:01:36 +00:00
|
|
|
|
// 这里跳出,可能是服务器关闭了m_sockServer
|
2022-05-23 10:29:23 +00:00
|
|
|
|
break;
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
2022-05-23 10:29:23 +00:00
|
|
|
|
|
|
|
|
|
p->PostConnectMsg(inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port), socketConn);
|
2022-05-23 02:35:42 +00:00
|
|
|
|
}
|
|
|
|
|
}
|