|
@@ -2,8 +2,6 @@
|
|
|
#include "PipeClient.h"
|
|
|
#include "Utility.h"
|
|
|
|
|
|
-#define BUFSIZE 512
|
|
|
-
|
|
|
CPipeClient::CPipeClient(LPCTSTR lpPipeName, DWORD dwMode)
|
|
|
{
|
|
|
m_hReadInst = INVALID_HANDLE_VALUE;
|
|
@@ -31,7 +29,7 @@ BOOL CPipeClient::StartWork()
|
|
|
HANDLE hConnect = CreateThread(NULL, 0, ConnectThread, this, 0, NULL);
|
|
|
HANDLE hReadMsg = CreateThread(NULL, 0, ReadMsgThread, this, 0, NULL);
|
|
|
|
|
|
- if ( hConnect == NULL || hReadMsg == NULL )
|
|
|
+ if ( hConnect == NULL )
|
|
|
bRet = FALSE;
|
|
|
|
|
|
if ( hConnect )
|
|
@@ -75,7 +73,7 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
|
|
|
0,
|
|
|
NULL,
|
|
|
OPEN_EXISTING,
|
|
|
- 0,
|
|
|
+ FILE_FLAG_OVERLAPPED,
|
|
|
NULL);
|
|
|
|
|
|
|
|
@@ -92,16 +90,6 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
|
|
|
Utility::dprintf(_T("SetNamedPipeHandleState failed. GLE=%d\n"), GetLastError() );
|
|
|
CloseHandle(pInstance->m_hReadInst);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- pInstance->m_hWriteInst = CreateFile(
|
|
|
- pInstance->m_szPipeName,
|
|
|
- GENERIC_READ | GENERIC_WRITE,
|
|
|
- 0,
|
|
|
- NULL,
|
|
|
- OPEN_EXISTING,
|
|
|
- 0,
|
|
|
- NULL);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -130,6 +118,7 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
if ( !pInstance )
|
|
|
return 0L;
|
|
|
|
|
|
+ int i = 0;
|
|
|
while(!pInstance->m_bClientStop)
|
|
|
{
|
|
|
if ( pInstance->m_hReadInst == INVALID_HANDLE_VALUE ) {
|
|
@@ -140,16 +129,22 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
do
|
|
|
{
|
|
|
bSuccess = ReadFile(
|
|
|
- pInstance->m_hReadInst,
|
|
|
- chBuf,
|
|
|
- BUFSIZE*sizeof(TCHAR),
|
|
|
- &cbRead,
|
|
|
- NULL);
|
|
|
+ pInstance->m_hReadInst,
|
|
|
+ pInstance->m_IoRead.szBuffer,
|
|
|
+ BUFSIZE,
|
|
|
+ &cbRead,
|
|
|
+ (OVERLAPPED*)&pInstance->m_IoRead);
|
|
|
+
|
|
|
+ if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
|
|
|
+ break;
|
|
|
|
|
|
- if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
|
|
|
- break;
|
|
|
|
|
|
- Utility::dprintf(_T("读取数据:%ld, %ld, %s"), dwError, cbRead, chBuf);
|
|
|
+ if ( WaitFinish(pInstance->m_hReadInst, &pInstance->m_IoRead) )
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ Utility::dprintf(_T("读取数据%d:%ld, %ld, %s"), i++, dwError, pInstance->m_IoRead.m_Overlapped.InternalHigh, pInstance->m_IoRead.szBuffer);
|
|
|
|
|
|
#if 0
|
|
|
TCHAR szMsg[8912] = {0};
|
|
@@ -159,7 +154,6 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
|
|
|
memcpy(pInstance->m_szReceiveBuff + dwDataIndex, chBuf, cbRead);
|
|
|
dwDataIndex += cbRead;
|
|
|
- Sleep(50);
|
|
|
} while ( !bSuccess );
|
|
|
|
|
|
|
|
@@ -169,7 +163,7 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
if ( bSuccess )
|
|
|
{
|
|
|
Utility::dprintf(_T("读取到的消息=%d"), sizeof(pInstance->m_szReceiveBuff));
|
|
|
- Sleep(3000);
|
|
|
+
|
|
|
Utility::dprintf(_T("读取到的消息=%s"), pInstance->m_szReceiveBuff);
|
|
|
|
|
|
|
|
@@ -185,7 +179,7 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
}
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
- Sleep(10000);
|
|
|
+
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -197,6 +191,47 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
|
|
|
+{
|
|
|
+ bool bPendingIO = false;
|
|
|
+ switch(GetLastError())
|
|
|
+ {
|
|
|
+
|
|
|
+ case ERROR_IO_PENDING:
|
|
|
+ bPendingIO = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case ERROR_PIPE_CONNECTED:
|
|
|
+ SetEvent(pIoContext->m_Overlapped.hEvent);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ DWORD dwWait = -1;
|
|
|
+ DWORD dwTransBytes = -1;
|
|
|
+
|
|
|
+
|
|
|
+ dwWait = WaitForSingleObject(pIoContext->m_Overlapped.hEvent,INFINITE);
|
|
|
+ switch(dwWait)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ if (bPendingIO)
|
|
|
+ {
|
|
|
+
|
|
|
+ if( GetOverlappedResult(hPipe, &pIoContext->m_Overlapped, &dwTransBytes, FALSE) == FALSE)
|
|
|
+ {
|
|
|
+ printf("ConnectNamedPipe failed %d\n",GetLastError());
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WAIT_IO_COMPLETION:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
BOOL CPipeClient::SendMessage(PACKAGE &pak)
|
|
|
{
|
|
|
|
|
@@ -205,4 +240,23 @@ BOOL CPipeClient::SendMessage(PACKAGE &pak)
|
|
|
|
|
|
|
|
|
|
|
|
+ return FALSE;
|
|
|
+}
|
|
|
+
|
|
|
+BOOL CPipeClient::SendData(const TCHAR *lpszMsg, DWORD dwDataLen)
|
|
|
+{
|
|
|
+ if ( m_hReadInst == INVALID_HANDLE_VALUE )
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ static int i = 0;
|
|
|
+ DWORD dwNumberOfBytesWritten = 0;
|
|
|
+ char szMsg[255] = {0};
|
|
|
+ sprintf(szMsg, "发送内容:%d,%d", ::GetCurrentProcessId(), i++);
|
|
|
+ BOOL fWrite = WriteFile(m_hReadInst,szMsg,strlen(szMsg),&dwNumberOfBytesWritten,NULL);
|
|
|
+ if ( fWrite )
|
|
|
+ {
|
|
|
+ Utility::dprintf(_T("SendData:%s\n"),lpszMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
}
|