CAsyncSocket ::closures崩溃

嘿,即时通讯在Windows服务中做一些客户端/服务器的东西。 这个东西非常新。

我遇到的问题是,当我尝试通过服务pipe理器停止服务时,它崩溃。 我添加了一些MessageBoxes代码,以追踪他们在哪里崩溃,我发现,当它closures监听套接字崩溃!

我试图作为一个控制台应用程序来运行服务,并且自己调用了被称为SERVICE__CONTROL__STOP事件的函数,这样我可以很容易地重现这个bug并进行debugging。 但它工作正常。 当我通过服务pipe理器停止时,Windows服务只会崩溃

这是一些代码

主要function

int main(int argc, char* argv[]) { // Create the service object CTestService CustomServiceObject; if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { std::cerr << "MFC failed to initialize!" << std::endl; return 1; } // Parse for standard arguments (install, uninstall, version etc.) if (! CustomServiceObject.ParseStandardArgs(argc, argv)) { // StartService() calls ::StartServiceCtrlDispatcher() // with the ServiceMain func and stuff CustomServiceObject.StartService(); } // When we get here, the service has been stopped return CustomServiceObject.m_Status.dwWin32ExitCode; } 

服务处理程序callback函数

 // static member function (callback) to handle commands from the // service control manager void CNTService::Handler(DWORD dwOpcode) { // Get a pointer to the object CNTService* pService = m_pThis; pService->DebugMsg("CNTService::Handler(%lu)", dwOpcode); switch (dwOpcode) { case SERVICE_CONTROL_STOP: // 1 pService->SetStatus(SERVICE_STOP_PENDING); pService->OnStop(); // .. // .. // other event handling // .. // .. } 

OnStop()函数

 void CTestService::OnStop() { m_sListener.ShutDown(2); m_sConnected.ShutDown(2); MessageBox(NULL, "After Shutdown", NULL, IDOK); m_sConnected.Close(); MessageBox(NULL, "Closed connected socket", NULL, IDOK); // crashes here when I try to stop through service manager // but if I run as console application works fine and terminates successfully m_sListener.Close(); MessageBox(NULL, "Closed listener socket", NULL, IDOK); ::PostThreadMessage(m_dwThreadID, WM_QUIT, NULL, NULL); MessageBox(NULL, "After PostThreadMessage", NULL, IDOK); } 

编辑:如果连接(客户端连接到服务器)和客户端closures连接,然后服务停止没有崩溃。 它只会崩溃,如果套接字正在侦听,没有连接被接受或客户端不closures连接和服务停止:)

我猜它很清楚!

尝试添加: –

  WSADATA data; if(!AfxSocketInit(&data)) AfxMessageBox("Failed to Initialize Sockets",MB_OK| MB_ICONSTOP); 

到你的线程或类初始化程序。

问题是,你很可能使用来自多个线程的套接字。 事实上,正如文档所述,多线程和CAsyncSocket不会混合使用。

通常你会将套接字插入到它自己的工作线程中,然后当你需要的时候你会发信号给它关闭。