CAsyncSocket类::关闭崩溃(CAsyncSocket::Close Crashes)

2019-10-29 08:22发布

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

我现在遇到的问题是,当我试图阻止通过服务管理服务,它崩溃。 我添加了一些消息框代码,追踪他们的崩溃,我发现,当它关闭监听套接字崩溃!

我想作为控制台应用程序运行服务,并通过自己的所谓被称为SERVICE__CONTROL__STOP事件,让我可以重现bug和调试容易被接收的功能。 但它工作正常。 Windows服务只崩溃时,我阻止它通过服务管理器

下面是一些代码

主要功能

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

服务处理器回调函数

// 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);
}

编辑:如果建立了连接(客户端连接到服务器)和客户端关闭连接,然后停止该服务没有崩溃。 它只有在插座是听力和无连接被接受或客户端犯规关闭连接,并停止该服务崩溃:)

我猜它清楚!

Answer 1:

尝试添加: -

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

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



Answer 2:

问题是,你最有可能使用从多个线程插座。 多线程和CAsyncSocket的不要混用 - 事实上,正如文件指出。

通常你会推插座到它自己的工作线程,那么你将标志着它关闭,当你需要它。



文章来源: CAsyncSocket::Close Crashes