#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_DESC, "open webserver failed 1, port=%u", port); 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_DESC, "open webserver failed 2, port=%u", port); return false; } // listen if (0 != listen(sockServer, 5)) { #if defined(HG_CMP_MSC) closesocket(sockServer); #else close(sockServer); #endif HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3, port=%u", port); 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) { 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); } }