fast/CCEXPipe/CCEXPipeServer.cpp

190 lines
4.1 KiB
C++
Raw Normal View History

2025-01-20 10:30:01 +08:00
// CCEXPipe.cpp : <20><><EFBFBD><EFBFBD> DLL Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㡣
//
#include "stdafx.h"
#include "CCEXPipeServer.h"
#include <process.h>
#include <stdlib.h>
CCEXPipeServerBase* CCEXPipeServerBase::CreateObj()
{
return new CCEXPipeServer();
}
CCEXPipeServer::CCEXPipeServer()
{
m_hServerThr = NULL;
m_bActive = FALSE;
m_lPort = 0;
m_socket = -1;
m_LisentSock = -1;
InitializeCriticalSection(&m_cySocket);
}
CCEXPipeServer::~CCEXPipeServer()
{
DeleteCriticalSection(&m_cySocket);
}
BOOL CCEXPipeServer::SendeData(const char* pData, int lLen)
{
EnterCriticalSection(&m_cySocket);
if (-1 == m_socket)
{
LeaveCriticalSection(&m_cySocket);
return FALSE;
}
BOOL bRes = ::SendeData(m_socket, pData, lLen);
LeaveCriticalSection(&m_cySocket);
return bRes;
}
BOOL CCEXPipeServer::SendeMsg(int lMsgId, const char* pData, int lLen)
{
PIPE_DATA_STRUCT* pstSend = (PIPE_DATA_STRUCT*)new char[sizeof(PIPE_DATA_STRUCT) + lLen - sizeof(char[4])];
pstSend->lMsgId = lMsgId;
pstSend->lDataLen = lLen;
if (NULL != pData)
{
memcpy(&pstSend->acData, pData, lLen);
}
BOOL bRes = SendeData((const char*)pstSend, sizeof(PIPE_DATA_STRUCT) + lLen - sizeof(char[4]));
delete [] (char*)pstSend;
pstSend = NULL;
return bRes;
}
unsigned int __stdcall g_PipServerThr(void* pPara)
{
return ((CCEXPipeServer*)pPara)->ServerThr();
}
BOOL CCEXPipeServer::Start(const char* pPipeName)
{
if (TRUE == m_bActive)
{
return FALSE;
}
//<2F><><EFBFBD><EFBFBD>windows<77>ܵ<EFBFBD>Ϊ<EFBFBD><CEAA>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD>ײ㲻ʹ<E3B2BB>ùܵ<C3B9><DCB5>ˣ<EFBFBD>ֱ<EFBFBD><D6B1>ʹ<EFBFBD><CAB9>socket
m_bActive = TRUE;
m_lPort = atoi(pPipeName);
m_LisentSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int opt = 1;
setsockopt(m_LisentSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(opt));
SOCKADDR_IN stAddr;
ZeroMemory(&stAddr, sizeof(stAddr)); /*<2A>ռ<EFBFBD><D5BC><EFBFBD>ַ<EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ڴ<EFBFBD><DAB4>ռ䡣*/
stAddr.sin_family=AF_INET; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>˿ڵ<CBBF><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2>*/
stAddr.sin_port=htons(m_lPort); /*<2A>˿ڡ<CBBF>*/
stAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if (SOCKET_ERROR == bind(m_LisentSock, (SOCKADDR*)&stAddr, sizeof(SOCKADDR_IN)))
{
LogOutToFile("CCEXPipeServer::ServerThr bind error.[%d]",GetLastError());
closesocket(m_LisentSock);
return FALSE;
}
if (SOCKET_ERROR == listen(m_LisentSock, 1))
{
LogOutToFile("CCEXPipeServer::ServerThr listen error.[%d]",GetLastError());
closesocket(m_LisentSock); //<2F>ر<EFBFBD><D8B1>׽<EFBFBD><D7BD><EFBFBD>
return FALSE;
}
m_hServerThr = (HANDLE)_beginthreadex(NULL, 0, g_PipServerThr, this, 0, NULL);
return TRUE;
}
BOOL CCEXPipeServer::SleepForActive(int lMs)
{
for (int i = 0; i < lMs && TRUE == m_bActive; i+=20)
{
Sleep(lMs);
}
return m_bActive;
}
unsigned int CCEXPipeServer::ServerThr()
{
char* pReadBuf = new char[MAX_PIP_BUF];
HANDLE hEvent = NULL;
for (;m_bActive;)
{
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
SOCKADDR_IN stNewAddr = {0};
int lNewAddrLen = sizeof(SOCKADDR_IN);
m_socket = accept(m_LisentSock, (struct sockaddr *)&stNewAddr, &lNewAddrLen);
if (SOCKET_ERROR == m_socket)
{
LogOutToFile("CCEXPipeServer::ServerThr accept error.[%d]",GetLastError());
SleepForActive(2000);
continue;
}
//֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pCallBackFun(m_pCallBackObj, CEXPIPE_NEW_CLIENT, NULL, NULL);
for (;;)
{
int lRead = 0;
memset(pReadBuf, 0, MAX_PIP_BUF);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if(FALSE == ReadPipePacket(m_socket, pReadBuf, MAX_PIP_BUF-1, lRead))
{
//PostMessage(m_hWnd, WM_PIPE_DIS_CLIENT, (WPARAM)this, (LPARAM)NULL);
m_pCallBackFun(m_pCallBackObj, CEXPIPE_DIS_CLIENT, (WPARAM)this, (LPARAM)NULL);
break;
}
pReadBuf[lRead] = '\0';
m_pCallBackFun(m_pCallBackObj, CEXPIPE_NEW_DATA, (WPARAM)pReadBuf, (LPARAM)lRead);
}
closesocket(m_socket);
m_socket = SOCKET_ERROR;
}
delete [] pReadBuf;
LogOutToFile("CCEXPipeServer::ServerThr <20>˳<EFBFBD>[%d]", GetLastError());
m_hServerThr = NULL;
return 0;
}
BOOL CCEXPipeServer::Stop()
{
if (NULL == m_hServerThr)
{
//<2F>Ѿ<EFBFBD>ֹͣ<CDA3><D6B9>
return FALSE;
}
m_bActive = FALSE;
closesocket(m_LisentSock);
closesocket(m_socket);
if (WAIT_TIMEOUT == WaitForSingleObject(m_hServerThr, 2000))
{
LogOutToFile("ERROR: CCEXPipeServer::Stop timeout\r\n");
TerminateThread(m_hServerThr, 0);
m_hServerThr = NULL;
}
m_hServerThr = NULL;
return TRUE;
}