2009-08-10 128 views
1

我正在做套接字编程。它非常新。等到事件发生时

该应用程序是一个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中做请不要告诉我太:)

回答

-1

在一个服务,你通常会使用WaitForMultipleObjects的等待力所能及的事情你(WSAEventSelect用于不使用框架时的套接字)+当服务管理器告诉您退出时发出的退出事件

+0

你能告诉我究竟如何等待客户端连接到服务器? 这项工作? m_Listener.Listen(); WaitForSingleObject(m_Listener); – akif 2009-08-11 05:49:50

-1

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

bind(listenerSocket); 

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

    process(clientSocket); 
} 

监听呼叫阻塞,正在等待连接。这样你可以处理多个连接。过程方法通常在线程池中产生一个线程。

我不熟悉MFC套接字,但你有更多的OO方式等价的东西。有很多关于这类事情的教程。您还可以使用处理套接字的库(您获得可移植性),如boost

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

bind(listenerSocket); 

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

process(clientSocket); 
+0

即时通讯使用MFC的插座 – akif 2009-08-11 11:35:14

+1

你说你用win32没有问题。我听说winsock没有问题...顺便说一句,我给你伪代码。你可以在MFC套接字中找到等价的调用,这是我记得围绕在winsock上的OO。 – neuro 2009-08-11 12:52:45

+0

是的,但如果我必须按照你的方式,我将不得不重写所有的文件 – akif 2009-08-11 15:39:47