// CCEXPipe.cpp : 定义 DLL 应用程序的入口点。 // #include "stdafx.h" #include "CCEXPipeClient.h" #include #include 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; }