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

-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

im с использованием гнезд MFCs – akif

+1

Вы сказали, что у вас нет проблем с win32. Я не слышал никаких проблем с winsock ... кстати, я даю вам псевдокод. Вы можете найти эквивалентные вызовы в MFC-сокете, которые предназначены для того, что я вспоминаю OO-обертывание вокруг winsock. – neuro

+0

Да, но если мне нужно следовать вашему пути, мне придется переписать все. – akif