IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

[THREAD] WSAEventSelect dans plusieurs threads


Sujet :

Visual C++

  1. #1
    Invité
    Invité(e)
    Par défaut [THREAD] WSAEventSelect dans plusieurs threads
    Bonjour tout le monde !

    Je viens vous trouver car j'ai un petit soucis concernant les threads et les selects de windows (WSAEventSelect en l'occurence).
    Je me penche actuellement sur un serveur HTTP, mais ne connaissant pas trop la programmation sous Windows (et le c++ en general) je me trouve confronte a un blocage. Voici ma demarche:

    J'ai un objet serveur qui contient les infos et methodes necessaires au demarage du serveur, de la creation de la socket d'ecoute jusqu'a l'acception d'un client...
    Quand un client se connecte, je cree une socket avec une structure contenant la socket de ce dernier ainsi qu'un pointeur vers l'objet serveur.
    Au niveau de la callback, j'avais pense gerer la lecture, l'ecriture et la fermeture de la socket du client, mais ayant deja un WSAEventSelect dans ma class serveur pour gerer les connexions, j'obtiens une erreur de cette fonction dans ma thread meme : WSAENOTSOCK...
    Pourquoi ? Y a t'il un lien avec le fait que j'ai deja appele un WSAEventSelect sur la socket serveur et qu'il y ai un heritage quelconque de propriete d'une socket a une autre ? Ou bien... quoi ?

    Code de mon thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    DWORD WINAPI server::ThreadProc(LPVOID lpParam)
    {
    	WSAEVENT				thEvent;
    	DWORD					tdEvent;
    	WSANETWORKEVENTS		NetworkEvents;
    	struct pthread_params *tparams;
     
    	tparams = reinterpret_cast<struct pthread_params*>(lpParam);
    	thEvent = WSACreateEvent();
    	if (WSAEventSelect(tparams->cSock, thEvent, FD_WRITE | FD_READ | FD_CLOSE) == SOCKET_ERROR)
    	{
    		cerr << "WSAEventSelect Threaded: " << WSAGetLastError() << endl;
    		return EXIT_FAILURE;
    	}
    	while (TRUE)
    	{
    		tdEvent = WSAWaitForMultipleEvents(1, &thEvent, FALSE, WSA_INFINITE, FALSE);
    		if (WSAEnumNetworkEvents(tparams->cSock, thEvent, &NetworkEvents) == SOCKET_ERROR)
    		{
    			cout << "WSAEnumNetworkEvents: " << WSAGetLastError() << endl;
    			NetworkEvents.lNetworkEvents = 0;
    		}
    		else
    		{
    			if (FD_CLOSE & NetworkEvents.lNetworkEvents)
    			{
                               ...
    			}
    		}
    	}
        return 0;
    }

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Personne n'en aurait une petite idee ?
    Car ca me bloque vraiment la

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bon, de l'aide n'est plus necessaire j'ai trouve une autre solution...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Decidement...

    En realite la solution trouvee n'etait pas assez correcte pour ce que je voulais faire.
    Je re-explique donc un peu mieux ce que j'ai comme soucis.

    J'ai un WSASelectEvent sur la socket de mon serveur, et ce dernier envoi la socket d'un client lorsqu'il y a connexion a une thread qui le gerera (le client).
    Cette thread va donc devoir gerer la lecture et l'ecriture sur cette SOCKET, donc je refais un appel a WSASelectEvent afin de determiner le fait que je veuille receptionner et les FD_WRITE et les FD_READ.

    Cependant, quand je fais mon second appel a WSASelectEvent, que ce soit celui pour reinitialiser les etats d'une socket (avec 0 comme type d'event attendu) ou pour setter les read & write, la fonction me renvoit l'erreur suivante: WSAENOTSOCK...
    De plus, j'ai fait un send sur cette socket pour etre sur que ce ne soit pas des donnees incoherentes qui soient recuperees, mais mon client recoit bien le contenu du send...
    Quelqu'un aurait il une idee ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2008, 18h29
  2. [Thread] Gestion de plusieurs thread
    Par be_tnt dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 14/07/2006, 13h35
  3. [Thread]Comment créer plusieurs thread à la demande??
    Par Devil666 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 14/09/2005, 13h29
  4. [Thread] DB dans un thread
    Par Pedro dans le forum Bases de données
    Réponses: 5
    Dernier message: 02/06/2005, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo