Bonsoir,

Le contexte: réaliser un serveur bootp qui tourne dans un thread.

Mon soucis est lorque je désire terminer le thread.
1) Lorsque le thread se termine, j'ai une erreur windows 0xc0000005. A ce que je compris, cela provient des variables dynamiques non libérées.
Pourtant je me suis inspiré de la FAQ pour gérer cela sous forme d'événements.
Comment arreter un thread de travail?

2) Mon deuxième soucis est de stopper la fonction recvfrom qui est bloquante.
J'ai effectué diverses tentatives mais aucune s'est avéré fonctionnées.

Voici des bouts de code pour illustrer l'affaire:
(En commentaire, les différentes tentatives que j'ai pu faire)

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
 
/*************************************************************************
  erreur: Ferme le socket
 
  Valeur de retour:
 
  15/11/2006
*************************************************************************/
void bootps::erreur()
{
	/*if(WSAAsyncSelect(bootps_socket, (HWND)m_hThread, 0, FD_CLOSE) != 0){
		trace("WSAAsyncSelect a echoue\n");
		int numError = WSAGetLastError();
	}*/
/*Le teste echoue...*/
 
	/*if (WSAEventSelect(bootps_socket, m_hThread, FD_CLOSE) != 0){
		trace("WSAEventSelect a echoue\n");
	}*/
/*Le teste echoue...*/
 
	if (shutdown(bootps_socket,SD_BOTH) != 0)
		trace("shutdown a échoue\n");
 
	if(closesocket(bootps_socket) !=0)
		trace("Erreur fermeture socket\n");
	::WSACleanup();
}
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
34
 
/*************************************************************************
  stopThreadServeur: Stop le thread du serveur bootp.
 
  Valeur de retour:
        true si aucune erreur durant l'initialisation
        false sinon
 
  15/11/2006
*************************************************************************/
bool bootps::stopThreadServeur()
{
	//Fermer le socket serveur
	erreur();	
 
	cout << "Fermeture du thread..." << endl;
 
	SetEvent(m_hEndThread);
 
	// attend que le thread soit terminé
	WaitForSingleObject(m_hWaitThread, INFINITE);
 
	// fermeture dans handles
	CloseHandle(m_hEndThread);
	CloseHandle(m_hWaitThread);
 
	//Termine la boucle infini du thread
	//m_flagThread = false;
 
	//Fermer le socket serveur
	//erreur();	
 
	return true;
}
Une partie du serveur, notamment l'appel à recvfrom et le moyen de stopper le 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
34
35
36
37
 
while (true)
{
		// attente evenement de fin du thread. -> l'objet doit être ‘signalé ‘
		// WaitForSingleObject  renvoie WAIT_OBJECT_0 si l'objet est signalé.
		/*if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0)
 
		{
			//Liberation des ressources
			free((struct bootp *)bootp_recv); bootp_recv = NULL;
 
			// signale l'objet event d'attente et sort.
			SetEvent(m_hWaitThread);
			return 0;
		}*/
 
		cod_ret = recvfrom(	bootps_socket,
				(char*)bootp_recv,
				BUFSIZ,
				0,
				(struct sockaddr *)NULL, (int *)NULL);
 
		// attente evenement de fin du thread. -> l'objet doit être ‘signalé ‘
		// WaitForSingleObject  renvoie WAIT_OBJECT_0 si l'objet est signalé.
		if(WaitForSingleObject(m_hEndThread, 0) == WAIT_OBJECT_0)
 
		{
			//Liberation des ressources
			free((struct bootp *)bootp_recv); bootp_recv = NULL;
 
			// signale l'objet event d'attente et sort.
			SetEvent(m_hWaitThread);
			return 0;
		}
 
	... //code
}
Merci de vos suggestions ou corrections pour remédier à cela, je commence à sécher...

Bonne soirée

Nicolas