code_app/sdk/webscan/WebServer.cpp

262 lines
5.3 KiB
C++
Raw Normal View History

2022-09-06 08:27:58 +00:00
#include "WebServer.h"
#include "WebUser.h"
#include "base/HGInfo.h"
WebServer::WebServer(HGMsgPump msgPump)
{
m_msgPump = msgPump;
m_currUserId = 1;
#if defined(HG_CMP_MSC)
m_sockServer = INVALID_SOCKET;
#else
m_sockServer = -1;
#endif
m_listenThread = NULL;
}
WebServer::~WebServer()
{
}
bool WebServer::Open(HGUShort port)
{
#if defined(HG_CMP_MSC)
if (INVALID_SOCKET != m_sockServer)
#else
if (-1 != m_sockServer)
#endif
{
return false;
}
#if defined(HG_CMP_MSC)
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockServer)
#else
int sockServer = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockServer)
#endif
{
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 1, port=%u", port);
2022-09-06 08:27:58 +00:00
return false;
}
// bind
#if defined(HG_CMP_MSC)
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)))
#else
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)))
#endif
{
#if defined(HG_CMP_MSC)
closesocket(sockServer);
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 2, port=%u", port);
2022-09-06 08:27:58 +00:00
return false;
}
// listen
if (0 != listen(sockServer, 5))
{
#if defined(HG_CMP_MSC)
closesocket(sockServer);
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "open webserver failed 3, port=%u", port);
2022-09-06 08:27:58 +00:00
return false;
}
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()
{
#if defined(HG_CMP_MSC)
if (INVALID_SOCKET == m_sockServer)
#else
if (-1 == m_sockServer)
#endif
{
return false;
}
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin());
delete pUser;
pUser = NULL;
}
#if defined(HG_CMP_MSC)
closesocket(m_sockServer);
m_sockServer = INVALID_SOCKET;
#else
close(m_sockServer);
m_sockServer = -1;
#endif
HGBase_CloseThread(m_listenThread);
m_listenThread = NULL;
return true;
}
void WebServer::Connect(const ConnectParam* param)
{
assert(NULL != param && this == param->svr);
if (!m_vectorUser.empty())
{
#if defined(HG_CMP_MSC)
closesocket(param->socket);
#else
close(param->socket);
#endif
return;
}
WebUser* user = new WebUser(this, m_currUserId, m_msgPump, param->ip, param->port, param->socket);
++m_currUserId;
m_vectorUser.push_back(user);
}
void WebServer::DisConnect(const DisConnectParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
WebUser* pUser = m_vectorUser[nIndex];
m_vectorUser.erase(m_vectorUser.begin() + nIndex);
delete pUser;
pUser = NULL;
}
}
void WebServer::CloseDev(const CloseDevParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->CloseDev(param);
}
}
void WebServer::ScanFinish(const ScanFinishParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->ScanFinish(param);
}
}
void WebServer::Command(const WSCmdParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->HandleCmd(param);
}
}
void WebServer::Event(const WSEvtParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->HandleEvent(param);
}
}
#if defined(HG_CMP_MSC)
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, SOCKET sockConn)
#else
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, int sockConn)
#endif
{
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))
{
#if defined(HG_CMP_MSC)
closesocket(param->socket);
#else
close(param->socket);
#endif
delete param;
}
}
int WebServer::GetUserIndex(HGUInt id)
{
int nIndex = -1;
for (int i = 0; i < (int)m_vectorUser.size(); ++i)
{
if (id == m_vectorUser[i]->GetId())
{
nIndex = i;
break;
}
}
return nIndex;
}
void HGAPI WebServer::ThreadFunc(HGThread thread, HGPointer param)
2022-09-06 08:27:58 +00:00
{
WebServer* p = (WebServer*)param;
while (1)
{
#if defined(HG_CMP_MSC)
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR_IN);
SOCKET socketConn = accept(p->m_sockServer, (SOCKADDR*)&addrClient, &len);
if (INVALID_SOCKET == socketConn)
#else
struct sockaddr_in addrClient;
socklen_t len = sizeof(addrClient);
int socketConn = accept(p->m_sockServer, (struct sockaddr*)&addrClient, &len);
if (-1 == socketConn)
#endif
{
// 这里跳出可能是服务器关闭了m_sockServer
break;
}
p->PostConnectMsg(inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port), socketConn);
}
}