From eb3a4b70637c3ae989967cfd70f84048bcfb664a Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Thu, 17 Dec 2015 13:12:38 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20threads=20compl=C3=A8te=20(avec?= =?UTF-8?q?=20positionnement=20dans=20le=20tableau)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dep/server.c | 6 +++--- proxy_ftp.c | 43 ++++++++++++++++++++++++++++++++++++------- proxy_ftp.h | 22 ++++++++++++---------- test | Bin 22870 -> 22870 bytes 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/dep/server.c b/dep/server.c index 3ae9979..4247e57 100644 --- a/dep/server.c +++ b/dep/server.c @@ -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)) - int nbSend; // contiendra le nombre de données envoyées - char rCommand[5]; // contiendra les commandes (1ère partie) - char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) + int nbSend; // contiendra le nombre de données envoyées + char rCommand[5]; // contiendra les commandes (1ère partie) + char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) // on vide les buffers memset(&rCommand, '\0', sizeof(rCommand)); diff --git a/proxy_ftp.c b/proxy_ftp.c index 66be055..8b0008c 100644 --- a/proxy_ftp.c +++ b/proxy_ftp.c @@ -40,15 +40,33 @@ int main(int argc, char* argv[]){ /* [2] Attente d'une demande de connection, puis création d'un THREAD ============================================================================*/ - int index = 0; - while( index <= maxListLen ){ - THREADABLE_SOCKET = -1; // on initialise la SOCKET en attendant la connexion + int index = -1; + while( 1 ){ + /* 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); - // on lance un thread pour le traitement - pthread_create(&managers[index], NULL, manageConnection, (void*)(intptr_t) THREADABLE_SOCKET); - index++; + /* 3. On cherche un "manager" libre */ + int i; + + // 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(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); } \ No newline at end of file diff --git a/proxy_ftp.h b/proxy_ftp.h index 6366e4b..57e5dc6 100644 --- a/proxy_ftp.h +++ b/proxy_ftp.h @@ -22,23 +22,25 @@ #define REVEALS 0x08 // debug EXPLICITATION des strings #define BUFFERS 0x10 // debug des BUFFERS #define HEADERS 0x20 // debug des HEADERS de fonctions +#define THREADS 0x40 // debug des THREADS -#define SCK 0x01 // FILTRE pour ONLY_SOCKET -#define CMD 0x02 // FILTRE pour ONLY_COMMAND -#define DAT 0x04 // FILTRE pour ONLY_DATA -#define RVL 0x08 // FILTRE pour ONLY_REVEALS -#define BUF 0x10 // FILTRE pour ONLY_BUFFERS -#define HDR 0x20 // FILTRE pour ONLY_HEADERS +#define SCK 0x01 // FILTRE pour SOCKET +#define CMD 0x02 // FILTRE pour COMMAND +#define DAT 0x04 // FILTRE pour DATA +#define RVL 0x08 // FILTRE pour REVEALS +#define BUF 0x10 // FILTRE pour BUFFERS +#define HDR 0x20 // FILTRE pour HEADERS +#define THR 0x40 // FILTRE pour THREADS // possibilité de cumuler les DEBUGMODES -#define DEBUGMOD COMMANDS // REVEALS + HEADER +#define DEBUGMOD 0 // REVEALS + HEADER + THREADS /* vars */ #define remoteHost "localhost" #define remotePort "80" #define maxBuffLen 4096 -#define maxListLen 2 +#define maxListLen 10 #define maxHostLen 64 #define maxPortLen 6 @@ -111,5 +113,5 @@ void* manageConnection(void* THREADABLE_SOCKET); // VARIABLES -static pthread_t managers[maxListLen]; // contiendra les THREADS -static int activeManagers = 0x00; // sert à détecter les THREADS utilisés \ No newline at end of file +static pthread_t managers[maxListLen]; // contiendra les THREADS +static int activeManagers[maxListLen] = {0}; // contiendra les THREADS actifs diff --git a/test b/test index f5cb98680dc7b261de7e1adb773b7b202919490d..020360e6465f43740407916ddf8e7e71c531491e 100755 GIT binary patch delta 3066 zcmZ`*3s6+o89wK-5ZDMTj|wc0T@+YIcq~K{Y@%5L7Y~ugvOr4HTA)0N8AJlCl8(4A z>&CgcA+?^tA(Pm#(^jO9sm&&>z{o-|ET*l&46$@#o5eu0h{c+*4NY`z|8p-(pff!K z_q*qRo&RzEfA96T@b$Ow$(f)?Ba&C-5C8H6o~B{=M3^~UA(_)n@{5@c;g2EBPK96mt@xLka~d5!xXrXE!^HLGfAF5t8(8uvKoRr|53qp_ul?hHtB zHU+#I5ISx!A>y7e%is>6IJh_R^~dxGS;MM`u;@J|Nz(o)|CgPog9kWn&fqj^{^gI& z&XlcL99BD@i%!B}A2Vga?S1w$Npg&bI!34%6N`UD2V=Uq1p`gdCdA)a6IuL^BoWc! zy(&o}vad>3wQJQt>$F?d(W#1&FTbFx+HCrvHW3fe&$WdQ#{%Ob3)@R5iG4IEeNC{F z9*rFg$yRoXfJC$7(n82a5~0m;37M4}Npb&VKJx`Yp7$Wa&Adjh%Q^BuJfA2vW5ns!tuh4{;C@x}!z7`*azo6&h zbsF7WX2#JYn|FIh>4)*rOxAYOCwex76v)MCdY;Q43#E z#9Meh5vr@nu!Y}S%qJ!W6M@vaP0i|@oa`pIsU=uFWokuBzot%ob!gY4ay68+MlDlq zV(R9+)>3m~Ldd4P?x05#b>A3l-^dz$cB{6y0QP2?j6X)M)8Agbyh#7|zLg zTwidgwUr2gWNdP%(bl1FZ=57TTOe@_S{pkOgVoRjU7Dp{xDh_BQKnURpcN7yO@g4D+?$$_g&zS|GBw$=?B}hvgU!~=I^sEBVv_@39V)5r~iNq@%QcB_a$qX z>kp6|Z^Nh5m}Ih%-rM6KFI*~y5kZ7^OaKi;RC|N! zUcd=Zayz~aI&5up#zzw!ip75B9Snmu2EtY7@%3(X3 zSBo6u))0jz$mc9;?6L&5Ut&r@$KJPJlF#bgFUrP1wVx44{Rd>?rXT4WF@YH(OpN>_ z*@VW}Dc)Z!vP;aQAi{g=(cD`nlL7bI`Oqn7DH$YPYWQjJo&u4jt*~XIyMown=MtfN z8mc)h@H1|H7C2DmIR$Poa3Kwx_z26c05$L9XU3|PS?R^gV2t$-+z6SoR*J(9pk}L* z&Fa52D07)!_YKllGDrHVW=WrQrbt+2lkyB31!4)XWdpNo^Yux&4gas!8~l-GA4%W4|PY$V3K_i>4je7X&Y;JF? zYk&#WWbJ@qm5B0-%PNXW_v-V@N=y0t%A&H;3besW%YpAs4#`Fkj`e%;m*8F`{9pK+ zB&`CT^hnY)VE4Qv=`pe)>rF@lT)x~-B&iMXJm3J}n-J1Pz+gzz9AFpVDquZauxJjU zMd&IMU?vRYWss*27UMSn|6yo? za~t`*U5>T@_{V`iKzAAQ{r?DW+@>my(Ui~pI1P6 z(ii?N^4X4uZDeUn@oF)i=N4^$;r&g+=)u^O7r&eH5R_Y3@ykzAE{2q F{{^*h0w@3g delta 3220 zcmZ`+eNa@_6~FhfAW#<;MP*@ux5&p@*=0eaG_kk_cD*Q{3pA@4D-0i%7SW1CY9lM9 zYkjlbDSE}B({?7!bjCWV8N+HDG_s{^*@~ z@7#ON?|j^Q&OQ6~+919*i2L4)Ibub8969ul)wqx*;GZR2&Q)2Lb8UQbnI6X}AG(+u%y>u#ghIU6|Gw}&OiyZ(XqBcOOY{v*9xc=)`KL7wOgBcQ z%-^|t+pgw@rmf%K(c12Bj`BstBa;o0;7DH%Bf&O`wLOW_3K5~sggPSKkh>K{*)kUS zlK-f7KoF8leyi?YB>tm6dvTtC1^;)FGI2sWvmpiL4PPmW=X|{96YABc;1POEzfZ_C z(d^{3)VvVn#sftmUXOfLQM{;kTIq}p6q;y5@?x_qg!uZQq71V|;6-@JtL}4!q<4Wx zV}TaN%eYT_lAXeVJ3#VjR7&DEb^`lNc0_U(%}QAw(*tW3Q8nF^axCtEx>5lj(>TMj z&A)k?l{E#?coMiLB6MnIPcZk@5yQWvIt7v^q7Zbm~i{=wXUy zkPe|?wkf9gcP{83zs}^o{i^+2QxZ=R%`X>0KndOB^7u1+&Y)JNB(XA9{X+LXQtkJ91vqifFYZ0Hc%8pJ9h zxvI#J(_UU`ciKfF5f?e@w68C-8;x3!)dy|cVhalLTY|PWZS0t>9Zh^i`$Sj#d&_xZ z)KuL4g5DQRadUFKjRXS^l6iotR)7`Es2*x=BHAFFZ5_aPsA5r~I7CXdp0 zjj8w?{nD6*U!(IglHDsOz^&I~0wphk0@MRcjsBs`C9DKM5>%OyDm=s-3s`31?*QEE z*#>B^QZmav#jHT3+~&p#K^&@-gAkeIS;G`&)hcGyy15#!6LPkoV3k<1qrII-No45a z@#YS3SMx>42|bZv$Qfo*M{7GI$x6;PHM8{X-UT^|CPNMF9Sx1UTX!(*R7PsPUfoh? zv!N|%fO#t!YM!v*!j;3T`A4*9seaMcn=JOZHSMKsOY`uL>90Xv1f?t4XL|R|D4hub z7wkcP{5gGlsm)zOdM5t@1umUi18s&#r>#Jmh*!NDM6%2I=YyVFV6qYPl)!sG-~&RcMFE@a@MMxF1L3+nDukV*)ow#sb?}K)rW>8Agu< z_RJpiW>5-x%0LHPqFaqm!tr`kOZ_Y=xRdqV(^a^9Q4pBK!}jtw8SwTq3#9R{WaQHb z;yWX*tA|_d9yx=vZR#DD58r@oa7VcJ977A;M}nRzm~h9LUOp!Sa5{fx>a(3ef(U!L z5EL06cmFMLkZo!!m{g+-m*)xK5bqY&ehgVAH&}-L)5@4Vqbw0GZn?<1KIxsb5^3Lu zkkt<%2|@cLm{o%IDV5x1B*5B}e1+*s_G#j?%flx_UH5liD9XePm?PdgE(s;T{Rkq3 zo*y}JiwoVL2MIXAVlBVLB4dX3-6g*ADdMY}B)(3$R02#;&SSTqi2=`l7g9OC9Pr%5 zWT^eVrS?~j&JAZHBZH$R!|R2x48X}CxfNzD@##NBv@9pd;94xAI^r`k zT2r>{M*c@+mNV;W?9QjT^z`zztWel+*q!C}+B)d? zC3dm4vaZ%%BbLEaTv<_JFRm@Etf(=f;!p&!sJN`MrnF-H(_(~hO2l)&2V05oto)~< z+-37|MHvN(|D`Af=+X~>mH>V0Q$=Y5>du9OI|36C&gB%)LqIk_B$v!N#y$v|Z3eB2(;X0swNb+D z`SYR?G63sic$#Q}CEa)$w)BHJsFqn2+d87vmUQ8r&*&~oHqN5IwB%q19f7wt0R~*UCe!m}E-P*%N zRf5LkcNV=gPsm82Z`&=g8fYJEXiQXatV+;@mO2yXqO-Krkr(siQ@F>mI-$#KvId0;$YYQy_H9?J{*UJqo6dQ3>P3R>Z8l5e*xt;R9%T*pfS#zn6^wC$Mn;0IkOgO zk(jEkdEP-1Lx1aBf|t^UnkD{MoF%QOCO Ix^nUV0K