Răsfoiți Sursa

完成Pipe客户端读取功能。

Jeff 3 ani în urmă
părinte
comite
6691e16858

+ 65 - 83
Source/OGCAssist/OGCAssist/PipeClient.cpp

@@ -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;

+ 1 - 0
Source/OGCAssist/OGCAssist/PipeClient.h

@@ -43,6 +43,7 @@ private:
     // ¹ÜµÀͨÐÅģʽ;
     DWORD m_dwMode;
 
+	static std::string m_LastData;
 	static PER_IO_CONTEXT m_IoRead;
 	static PER_IO_CONTEXT m_IoWrite;
 public:

+ 1 - 0
Source/OGCAssist/OGCAssist/stdafx.h

@@ -12,6 +12,7 @@
 #include <windows.h>
 #include <tchar.h>
 #include <stdio.h> 
+#include <string>
 #ifdef _CONSOLE
 #include <stdlib.h>
 #endif