Подождите, пока событие не произойдет - PullRequest
1 голос
/ 10 августа 2009

Я занимаюсь программированием сокетов. Довольно много нового для него.

Приложение представляет собой службу 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, пожалуйста, сообщите мне тоже:)

Ответы [ 2 ]

0 голосов
/ 11 августа 2009

Правильный способ обработки сервера сокетов - что-то вроде (псевдокод с winsock):

bind(listenerSocket);

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

     process(clientSocket);
}

Слушающий вызов блокируется, ожидает подключения. Таким образом, вы можете обрабатывать несколько соединений. метод процесса обычно порождает поток в пуле потоков.

Я не знаком с гнездами MFC, но у вас есть эквивалентные вещи более оригинальным способом. Есть много учебников по этому поводу. Вы также можете использовать библиотеку для обработки сокетов (вы получаете мобильность ...), например boost .

Если вам нужно только обработать соединение и выполнить какой-то процесс, вы только делаете:

bind(listenerSocket);

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

process(clientSocket);
0 голосов
/ 10 августа 2009

В сервисе вы обычно используете WaitForMultipleObjects и ждете, что делает ваш сервис (WSAEventSelect для сокетов, когда не используется инфраструктура) + событие выхода, которое вы сигнализируете, когда менеджер сервиса говорит вам выйти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...