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![]()
Partager