【问题标题】:Wait Until Event Occurs等到事件发生
【发布时间】:2009-08-10 14:01:51
【问题描述】:

我正在做套接字编程。对它来说非常新。

该应用程序是一个 Windows 服务,在其ServiceMain() 函数中我调用CAsyncSocket::Listen() 方法来监听客户端连接。但是在它开始监听连接后,它会返回,ServiceMain() 函数会返回并且服务会停止。

我想要做的是,等到特定事件发生,比如WM_QUIT,直到监听连接。怎么办?

// static member function (callback)
void CNTService::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
{
    // m_Server containts two sockets
    // one for listening and one for accepting connections

    m_Server.StartListening();  // calls Listen method on the listener socket

    // it will return and service will quit
    // which I don't want
}

我可以混合 Win32 和 MFC,所以如果可以在 Win32 中完成,请告诉我:)

【问题讨论】:

    标签: c++ sockets mfc asynchronous


    【解决方案1】:

    在服务中,您通常会使用 WaitForMultipleObjects 并等待您的服务执行的任何操作(不使用框架时用于套接字的 WSAEventSelect)+ 当服务管理器告诉您退出时您发出信号的退出事件

    【讨论】:

    • 你能告诉我具体如何等待客户端连接到服务器吗?这行得通吗? m_Listener.Listen(); WaitForSingleObject(m_Listener);
    【解决方案2】:

    处理套接字服务器的正确方法类似于(使用 winsock 的伪代码):

    bind(listenerSocket);
    
    while(!stopped)
    {
         listen(listenerSocket);
         clientSocket = accept(listenerSocket);
    
         process(clientSocket);
    }
    

    监听调用被阻塞,等待连接。这样您就可以处理多个连接。 process 方法通常在线程池中产生一个线程。

    我不熟悉 MFC 套接字,但您以更面向对象的方式拥有相同的东西。有很多关于这类事情的教程。您还可以使用像 boost 这样的库来处理套接字(获得可移植性......)。

    如果你只需要处理一个连接并做一些处理,你只需要:

    bind(listenerSocket);
    
    listen(listenerSocket);
    clientSocket = accept(listenerSocket);
    
    process(clientSocket);
    

    【讨论】:

    • 你说win32没问题。我听说 winsock 没问题……顺便说一句,我给你伪代码。您可以在 MFC 套接字中找到等效的调用,这些调用用于我记得 OO 环绕winsock。
    • 是的,但如果我必须按照你的方式,我将不得不重写所有内容
    • 我不知道你的代码,但我的想法是为你提供不同的步骤。我认为您的 MFC 套接字中有等效的方法。这就是为什么我给你伪代码而不是winsock代码。重点是听完之后你必须接受一个连接。然后您将获得一个套接字句柄,该句柄将允许您接收/发送消息。无论如何,祝你好运......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多