|
@@ -2,6 +2,7 @@
|
|
|
#include "PipeClient.h"
|
|
|
#include "Utility.h"
|
|
|
|
|
|
+std::string CPipeClient::m_LastData;
|
|
|
PER_IO_CONTEXT CPipeClient::m_IoRead;
|
|
|
PER_IO_CONTEXT CPipeClient::m_IoWrite;
|
|
|
|
|
@@ -109,18 +110,14 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
|
|
|
}
|
|
|
|
|
|
DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
-{
|
|
|
- DWORD cbRead = 0;
|
|
|
- BOOL bSuccess = FALSE;
|
|
|
- TCHAR chBuf[BUFSIZE];
|
|
|
- DWORD dwDataIndex = 0;
|
|
|
- DWORD dwError = 0;
|
|
|
-
|
|
|
+{
|
|
|
CPipeClient *pInstance = (CPipeClient*)lpParam;
|
|
|
if ( !pInstance )
|
|
|
return 0L;
|
|
|
|
|
|
int i = 0;
|
|
|
+ DWORD dwError = 0;
|
|
|
+ BOOL bSuccess = FALSE;
|
|
|
while(!pInstance->m_bClientStop)
|
|
|
{
|
|
|
if ( pInstance->m_hPipeInst == INVALID_HANDLE_VALUE ) {
|
|
@@ -128,9 +125,9 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
-#if 0 // 分配足够大的缓冲,保证C/S两端通信内容不超过该大小;
|
|
|
+#if 1 // 分配足够大的缓冲,保证C/S两端通信内容不超过该大小;
|
|
|
bSuccess = ReadFile(pInstance->m_hPipeInst, m_IoRead.szBuffer, BUFSIZE, &m_IoRead.dwBufferSize, (OVERLAPPED*)&pInstance->m_IoRead);
|
|
|
- if ( !bSuccess )
|
|
|
+ if ( bSuccess )
|
|
|
{
|
|
|
// 打印结果;
|
|
|
Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
|
|
@@ -163,60 +160,70 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
if ( bSuccess )
|
|
|
{
|
|
|
// 打印结果;
|
|
|
- Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
|
|
|
+ dwError = GetLastError();// 此时bSuccess为True,但GetLastError仍为ERROR_MORE_DATA属于正常现象;
|
|
|
+ m_LastData.append((char*)m_IoRead.szBuffer, m_IoRead.m_Overlapped.InternalHigh);
|
|
|
// 处理结果;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
dwError = GetLastError();
|
|
|
- if ( )
|
|
|
- }
|
|
|
- // 由于缓冲区不够大,没能一次性读取完;
|
|
|
- if ( !bSuccess && )
|
|
|
- if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
|
|
|
-
|
|
|
- dwError = GetLastError();
|
|
|
- //if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
|
|
|
- // break;
|
|
|
-
|
|
|
- if ( WaitFinish(pInstance->m_hPipeInst, &m_IoRead) )
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
|
|
|
- //Utility::dprintf(_T("读取数据:%ld, %ld"), dwError, cbRead);
|
|
|
- // 追回数据;
|
|
|
- memcpy(pInstance->m_szReceiveBuff + dwDataIndex, chBuf, cbRead);
|
|
|
- dwDataIndex += cbRead;
|
|
|
+ if ( dwError == ERROR_MORE_DATA )
|
|
|
+ {// 如果立即返回,没有IO PENDING;
|
|
|
+ // 将当前数据保存;
|
|
|
+ m_LastData.append((char*)m_IoRead.szBuffer, m_IoRead.m_Overlapped.InternalHigh);
|
|
|
+ }
|
|
|
+ else if ( dwError == ERROR_IO_PENDING )
|
|
|
+ {
|
|
|
+ DWORD dwWait = -1;
|
|
|
+ DWORD dwTransBytes = -1;
|
|
|
+
|
|
|
+ // 等待读写操作完成;
|
|
|
+ dwWait = WaitForSingleObject(m_IoRead.m_Overlapped.hEvent,INFINITE);
|
|
|
+ switch(dwWait)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ // 获取Overlapped结果;
|
|
|
+ if( GetOverlappedResult(pInstance->m_hPipeInst, &m_IoRead.m_Overlapped, &dwTransBytes, TRUE) == FALSE)
|
|
|
+ {
|
|
|
+ dwError = GetLastError();
|
|
|
+ if ( dwError == ERROR_MORE_DATA )
|
|
|
+ {
|
|
|
+ m_LastData.append((char*)m_IoRead.szBuffer, m_IoRead.m_Overlapped.InternalHigh);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Utility::dprintf(_T("GetOverlappedResult:Error=%ld"), dwError);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ bSuccess = TRUE;
|
|
|
+ Utility::dprintf(_T("GetOverlappedResult:Error=%ld"), GetLastError());
|
|
|
+ m_LastData.append((char*)m_IoRead.szBuffer, m_IoRead.m_Overlapped.InternalHigh);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ // 读写完成;
|
|
|
+ case WAIT_IO_COMPLETION:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if ( dwError == ERROR_PIPE_CONNECTED )
|
|
|
+ {// 管道的另一端有一个过程;
|
|
|
+ DWORD dwWait = -1;
|
|
|
+ DWORD dwTransBytes = -1;
|
|
|
+ SetEvent(m_IoRead.m_Overlapped.hEvent);
|
|
|
+ Utility::dprintf(_T("管道的另一端有一个过程:ERROR_PIPE_CONNECTED\n"));
|
|
|
+ dwWait = WaitForSingleObject(m_IoRead.m_Overlapped.hEvent,INFINITE);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 清空缓存数据;
|
|
|
+ memset(m_IoRead.szBuffer, 0, BUFSIZE);
|
|
|
} while ( !bSuccess ); // repeat loop if ERROR_MORE_DATA
|
|
|
|
|
|
- // 清空缓存数据;
|
|
|
- dwDataIndex = 0;
|
|
|
- memset(chBuf, 0, BUFSIZE*sizeof(TCHAR));
|
|
|
- memset(m_IoRead.szBuffer, 0, BUFSIZE);
|
|
|
-
|
|
|
- if ( bSuccess )
|
|
|
- {
|
|
|
- Utility::dprintf(_T("读取到的消息=%d"), sizeof(pInstance->m_szReceiveBuff));
|
|
|
- //Sleep(3000);
|
|
|
- Utility::dprintf(_T("读取到的消息=%s"), pInstance->m_szReceiveBuff);
|
|
|
-
|
|
|
- // 消息处理;
|
|
|
- // ...
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Utility::dprintf(_T("ReadFile from pipe failed. GLE=%d\n"), dwError );
|
|
|
- if ( dwError == ERROR_PIPE_NOT_CONNECTED || dwError == ERROR_BROKEN_PIPE)
|
|
|
- {
|
|
|
- Utility::dprintf("CloseHandle\n");
|
|
|
- CloseHandle(pInstance->m_hPipeInst);
|
|
|
- pInstance->m_hPipeInst = INVALID_HANDLE_VALUE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- memset(pInstance->m_szReceiveBuff, 0, BUFSIZE*sizeof(TCHAR));
|
|
|
+
|
|
|
+ Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_LastData.size(), m_LastData.data());
|
|
|
+ m_LastData.clear();
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -227,7 +234,6 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
|
|
|
|
|
|
BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
|
|
|
{
|
|
|
-#if 1
|
|
|
bool bPendingIO = false;
|
|
|
switch(GetLastError())
|
|
|
{
|
|
@@ -267,30 +273,6 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
|
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
|
-#else
|
|
|
- DWORD dwError=::GetLastError();
|
|
|
- DWORD dwWait = -1;
|
|
|
- DWORD dwTransBytes = -1;
|
|
|
- WaitForSingleObject(pIoContext->m_Overlapped.hEvent, INFINITE); // 等待异步操作完成;
|
|
|
- if (dwError == ERROR_IO_PENDING) {
|
|
|
- while (!::GetOverlappedResult(hPipe, &pIoContext->m_Overlapped, &dwTransBytes, false)) {
|
|
|
- dwError = ::GetLastError();
|
|
|
- if ( dwError == ERROR_IO_PENDING ) {
|
|
|
- Sleep(50);
|
|
|
- //Utility::dprintf("读等待:%ld", dwError);
|
|
|
- } else if ( dwError == ERROR_SUCCESS || dwError == ERROR_IO_INCOMPLETE ) {
|
|
|
- //Utility::dprintf("读完成:%ld,%ld,%ld", dwError, dwTransBytes, pIoContext->m_Overlapped.InternalHigh);
|
|
|
- break;
|
|
|
- } else {
|
|
|
- //Utility::dprintf("读错误:%ld", dwError);
|
|
|
- dwTransBytes = 0;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return 1;
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
BOOL CPipeClient::SendMessage(PACKAGE &pak)
|
|
@@ -312,12 +294,12 @@ BOOL CPipeClient::SendData(const TCHAR *lpszMsg, DWORD dwDataLen)
|
|
|
static int i = 0;
|
|
|
DWORD dwNumberOfBytesWritten = 0;
|
|
|
char szMsg[255] = {0};//"你好----001";
|
|
|
- sprintf(szMsg, "发送内容:%d,%d", ::GetCurrentProcessId(), i++);
|
|
|
+ sprintf(szMsg, "发送内容00000000000000000000000000000000000000000000000000000000000000000000000000000000000000:%d,%d", ::GetCurrentProcessId(), i++);
|
|
|
BOOL fWrite = WriteFile(m_hPipeInst,szMsg,strlen(szMsg),&dwNumberOfBytesWritten, NULL);//;&m_IoWrite.m_Overlapped);
|
|
|
//WaitFinish(m_hPipeInst, &m_IoWrite);
|
|
|
if ( fWrite )
|
|
|
{
|
|
|
- Utility::dprintf(_T("SendData:%s\n"),lpszMsg);
|
|
|
+ Utility::dprintf(_T("SendData:%s\n"),szMsg);
|
|
|
}
|
|
|
|
|
|
return TRUE;
|