2009-08-10 51 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