Gestion des threads complète (avec positionnement dans le tableau)

This commit is contained in:
xdrm-brackets 2015-12-17 13:12:38 +01:00
parent c49d6264c7
commit eb3a4b7063
4 changed files with 51 additions and 20 deletions

View File

@ -132,9 +132,9 @@ void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSE
char response[maxBuffLen]; // contiendra la réponse (2*taille buffer pour strcat(BUFLEN, BUFLEN)) char response[maxBuffLen]; // contiendra la réponse (2*taille buffer pour strcat(BUFLEN, BUFLEN))
int nbSend; // contiendra le nombre de données envoyées int nbSend; // contiendra le nombre de données envoyées
char rCommand[5]; // contiendra les commandes (1ère partie) char rCommand[5]; // contiendra les commandes (1ère partie)
char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie)
// on vide les buffers // on vide les buffers
memset(&rCommand, '\0', sizeof(rCommand)); memset(&rCommand, '\0', sizeof(rCommand));

View File

@ -40,15 +40,33 @@ int main(int argc, char* argv[]){
/* [2] Attente d'une demande de connection, puis création d'un THREAD /* [2] Attente d'une demande de connection, puis création d'un THREAD
============================================================================*/ ============================================================================*/
int index = 0; int index = -1;
while( index <= maxListLen ){ while( 1 ){
THREADABLE_SOCKET = -1; // on initialise la SOCKET en attendant la connexion /* 1. On initialise la SOCKET en attendant la connexion et le rang du "manager" inactif */
THREADABLE_SOCKET = -1;
index = -1;
/* 2. On attends une connection */
THREADABLE_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len); THREADABLE_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len);
// on lance un thread pour le traitement /* 3. On cherche un "manager" libre */
pthread_create(&managers[index], NULL, manageConnection, (void*)(intptr_t) THREADABLE_SOCKET); int i;
index++;
// si on trouve un "manager" inactif, on l'enregistre dans index
for( i = 0 ; i < maxListLen ; i++ )
if( activeManagers[i] == 0 ){ index = i; break; }
// si on a trouvé un "manager" libre
if( index != -1 ){
/* 4. On lance un thread pour le traitement de ce client */
pthread_create(&managers[index], NULL, manageConnection, (void*)(intptr_t) THREADABLE_SOCKET);
if( DEBUGMOD&THR ) printf("THREAD[%d] démarré\n", index);
/* 5. On signale que ce "manager" est maintenant actif */
activeManagers[index] = 1;
}else
if( DEBUGMOD&THR ) printf("Demande de thread refusée!\n");
} }
@ -154,6 +172,17 @@ void* manageConnection(void* THREADABLE_SOCKET){
close(USER_SOCKET); close(USER_SOCKET);
close(FTP_SOCKET); close(FTP_SOCKET);
// on arrête le THREAD /* [10] Arrêt du THREAD
============================================================================*/
/* 1. On récupère le rang dans les "managers" */
int i, index = -1;
for( i = 0 ; i < maxListLen ; i++ )
if( managers[i] == pthread_self() ){ index = i; break; }
/* 2. On met à jour "activeManagers" */
if( index != -1 )
activeManagers[index] = 0;
if( DEBUGMOD&THR ) printf("THREAD[%d] libéré\n", index);
pthread_exit(NULL); pthread_exit(NULL);
} }

View File

@ -22,23 +22,25 @@
#define REVEALS 0x08 // debug EXPLICITATION des strings #define REVEALS 0x08 // debug EXPLICITATION des strings
#define BUFFERS 0x10 // debug des BUFFERS #define BUFFERS 0x10 // debug des BUFFERS
#define HEADERS 0x20 // debug des HEADERS de fonctions #define HEADERS 0x20 // debug des HEADERS de fonctions
#define THREADS 0x40 // debug des THREADS
#define SCK 0x01 // FILTRE pour ONLY_SOCKET #define SCK 0x01 // FILTRE pour SOCKET
#define CMD 0x02 // FILTRE pour ONLY_COMMAND #define CMD 0x02 // FILTRE pour COMMAND
#define DAT 0x04 // FILTRE pour ONLY_DATA #define DAT 0x04 // FILTRE pour DATA
#define RVL 0x08 // FILTRE pour ONLY_REVEALS #define RVL 0x08 // FILTRE pour REVEALS
#define BUF 0x10 // FILTRE pour ONLY_BUFFERS #define BUF 0x10 // FILTRE pour BUFFERS
#define HDR 0x20 // FILTRE pour ONLY_HEADERS #define HDR 0x20 // FILTRE pour HEADERS
#define THR 0x40 // FILTRE pour THREADS
// possibilité de cumuler les DEBUGMODES // possibilité de cumuler les DEBUGMODES
#define DEBUGMOD COMMANDS // REVEALS + HEADER #define DEBUGMOD 0 // REVEALS + HEADER + THREADS
/* vars */ /* vars */
#define remoteHost "localhost" #define remoteHost "localhost"
#define remotePort "80" #define remotePort "80"
#define maxBuffLen 4096 #define maxBuffLen 4096
#define maxListLen 2 #define maxListLen 10
#define maxHostLen 64 #define maxHostLen 64
#define maxPortLen 6 #define maxPortLen 6
@ -111,5 +113,5 @@
void* manageConnection(void* THREADABLE_SOCKET); void* manageConnection(void* THREADABLE_SOCKET);
// VARIABLES // VARIABLES
static pthread_t managers[maxListLen]; // contiendra les THREADS static pthread_t managers[maxListLen]; // contiendra les THREADS
static int activeManagers = 0x00; // sert à détecter les THREADS utilisés static int activeManagers[maxListLen] = {0}; // contiendra les THREADS actifs

BIN
test

Binary file not shown.