145 lines
3.2 KiB
C++
145 lines
3.2 KiB
C++
// CCEXPipe.cpp : 定义 DLL 应用程序的入口点。
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CCEXPipeClient.h"
|
|
#include <process.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
CCEXPipeClientBase* CCEXPipeClientBase::CreateObj()
|
|
{
|
|
return new CCEXPipeClient();
|
|
}
|
|
|
|
CCEXPipeClient::CCEXPipeClient()
|
|
{
|
|
m_hClientThr = NULL;
|
|
m_bConnect = FALSE;
|
|
m_lPort = -1;
|
|
m_socket = SOCKET_ERROR;
|
|
InitializeCriticalSection(&m_cySocket);
|
|
}
|
|
|
|
CCEXPipeClient::~CCEXPipeClient()
|
|
{
|
|
DeleteCriticalSection(&m_cySocket);
|
|
}
|
|
|
|
unsigned int __stdcall g_PipClientThr(void* pPara)
|
|
{
|
|
return ((CCEXPipeClient*)pPara)->ClientThr();
|
|
}
|
|
|
|
BOOL CCEXPipeClient::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 CCEXPipeClient::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;
|
|
}
|
|
|
|
BOOL CCEXPipeClient::Connect(const char* pPipeName)
|
|
{
|
|
if (NULL != m_hClientThr)
|
|
{
|
|
return FALSE;
|
|
}
|
|
m_lPort = atoi(pPipeName);
|
|
m_bConnect = TRUE;
|
|
m_hClientThr = (HANDLE)_beginthreadex(NULL, 0, g_PipClientThr, this, 0, NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CCEXPipeClient::DisConnect()
|
|
{
|
|
if (NULL == m_hClientThr)
|
|
{
|
|
return FALSE;
|
|
}
|
|
m_bConnect = FALSE;
|
|
if (SOCKET_ERROR != m_socket)
|
|
{
|
|
closesocket(m_socket);
|
|
m_socket = SOCKET_ERROR;
|
|
}
|
|
if (WAIT_TIMEOUT == WaitForSingleObject(m_hClientThr, 2000))
|
|
{
|
|
LogOutToFile("ERROR: CCEXPipeClient::DisConnect\r\n");
|
|
TerminateThread(m_hClientThr, 0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
unsigned int CCEXPipeClient::ClientThr()
|
|
{
|
|
char *pReadBuf = new char[MAX_PIP_BUF];
|
|
for (;TRUE == m_bConnect;)
|
|
{
|
|
SOCKET socket_lisent = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
SOCKADDR_IN stAddr;
|
|
ZeroMemory(&stAddr, sizeof(stAddr)); /*空间地址结构体所在的内存空间。*/
|
|
stAddr.sin_family=AF_INET; /*填充地址与端口的信息。*/
|
|
stAddr.sin_port=htons(m_lPort); /*端口。*/
|
|
stAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
|
|
|
|
if (SOCKET_ERROR == connect(socket_lisent, (SOCKADDR*)&stAddr, sizeof(SOCKADDR_IN)))
|
|
{
|
|
LogOutToFile("CCEXPipeClient::ClientThr connect error.[%d]", GetLastError());
|
|
closesocket(socket_lisent);
|
|
break;
|
|
}
|
|
m_socket = socket_lisent;
|
|
m_pCallBackFun(m_pCallBackObj, CEXPIPE_CONNECT_OK, NULL, NULL);
|
|
for (;;)
|
|
{
|
|
int lPacketLen = 0;
|
|
memset(pReadBuf, 0, MAX_PIP_BUF);
|
|
if (FALSE == ReadPipePacket(m_socket, pReadBuf, MAX_PIP_BUF, lPacketLen))
|
|
{
|
|
LogOutToFile("读取管道失败1[%d] [%d]", GetLastError(), lPacketLen);
|
|
break;
|
|
}
|
|
|
|
pReadBuf[lPacketLen] = '\0';
|
|
|
|
m_pCallBackFun(m_pCallBackObj, CEXPIPE_NEW_DATA, (WPARAM)pReadBuf, (LPARAM)lPacketLen);
|
|
}
|
|
closesocket(socket_lisent);
|
|
break;//本地连接失败
|
|
}
|
|
|
|
delete [] pReadBuf;
|
|
m_pCallBackFun(m_pCallBackObj, CEXPIPE_DIS_CLIENT, NULL, NULL);
|
|
|
|
return 0;
|
|
}
|
|
|