2009-08-10 12 views
1

Je fais la programmation des sockets. Assez nouveau pour ça.Attendez jusqu'à ce que l'événement se produise

L'application est un service Windows, dans sa fonction ServiceMain() j'appelle CAsyncSocket::Listen(), pour écouter les connexions client. Mais après qu'il commence à écouter les connexions, il retournera et la fonction ServiceMain() retournera et le service est arrêté. Ce que je veux faire avec ceci est que, attendez qu'un événement spécifique se produise dites WM_QUIT, jusqu'à ce qu'écoutez les connexions. Comment faire?

// 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 
} 

Je suis d'accord avec le mélange Win32 et MFC, donc si on peut le faire dans Win32 s'il vous plaît ne me dites aussi :)

Répondre

-1

Dans un service que vous utilisez normalement WaitForMultipleObjects et attendre tout ce qui a votre service (WSAEventSelect pour les sockets si vous n'utilisez pas de structure) + un événement de fermeture que vous signalez lorsque le gestionnaire de service vous demande de quitter

+0

Pouvez-vous me dire comment exactement attendre que le client de se connecter au serveur? Est-ce que cela fonctionnera? m_Listener.Listen(); WaitForSingleObject (m_Listener); – akif

-1

La façon correcte de gérer un serveur de socket est quelque chose comme (pseudo code avec Winsock):

bind(listenerSocket); 

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

    process(clientSocket); 
} 

L'appel listen bloque en attendant la connexion. De cette façon, vous pouvez gérer plusieurs connexions. la méthode de processus génère généralement un thread dans un pool de threads. Je ne suis pas familliar avec les sockets MFC mais vous avez les choses équivalentes d'une manière plus OO. Il y a beaucoup de tutoriels sur ce genre de choses. Vous pouvez également utiliser une bibliothèque de gestion des sockets (vous gagnez de la portabilité ...) comme boost.

Si vous ne devez gérer une connexion et faire un processus, vous ne faites:

bind(listenerSocket); 

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

process(clientSocket); 
+0

im utilisant les sockets des MFC – akif

+1

Vous avez dit que vous n'aviez aucun problème avec win32. Je n'ai pas entendu de problème avec winsock ... d'ailleurs je te donne un pseudo code. Vous pouvez trouver des appels équivalents dans le socket MFC qui sont pour ce que je me souviens OO envelopper autour de Winsock. – neuro

+0

Oui, mais si je dois suivre votre chemin, je vais devoir réécrire tout – akif

Questions connexes