From c49d6264c7f41c06e1ccd4bfb54498c1c03237c9 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Thu, 17 Dec 2015 12:44:28 +0100 Subject: [PATCH] Suppression des fichiers/dossiers inutiles --- backup/client.c | 64 --------- backup/proxy_aure.c | 336 -------------------------------------------- backup/serveur.c | 117 --------------- test | Bin 22870 -> 22870 bytes thread/main.c | 55 -------- thread/test | Bin 8915 -> 0 bytes 6 files changed, 572 deletions(-) delete mode 100644 backup/client.c delete mode 100644 backup/proxy_aure.c delete mode 100644 backup/serveur.c delete mode 100644 thread/main.c delete mode 100755 thread/test diff --git a/backup/client.c b/backup/client.c deleted file mode 100644 index efd0a9f..0000000 --- a/backup/client.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include -#include -#include -#include -#define MAXHOSTLEN 64 -#define MAXPORTLEN 6 -#define MAXBUFFERLEN 1024 -int main(int argc, char* argv[]){ - int descSock; // Descripteur de la socket - int ecode; // Retour des fonctions - struct addrinfo *res; // Résultat de la focntion getaddrinfo - struct addrinfo hints = { // Cette structure permet de contrôler l'exécution de la fonction getaddrinfo - 0, - AF_INET, //seule les adresses IPv4 seront présentées par la fonctiongetaddrinfo - SOCK_STREAM, - 0, - 0, - NULL, - NULL, - NULL - }; - char serverName[MAXHOSTLEN]; // Nom de la machine serveur - char serverPort[MAXPORTLEN]; // Numéro de port - char buffer[MAXBUFFERLEN]; // buffer stockant les messages échangés entre le client et le serveur - //On teste les valeurs rentrées par l'utilisateur - if (argc != 3){ perror("Mauvaise utilisation de la commande: \n"); exit(1);} - if (strlen(argv[1]) >= MAXHOSTLEN){ perror("Le nom de la machine serveur est trop long\n"); exit(2);} - if (strlen(argv[2]) >= MAXPORTLEN){ perror("Le numero de port du serveur est trop long\n"); exit(2);} - strncpy(serverName, argv[1], MAXHOSTLEN); - serverName[MAXHOSTLEN-1] = '\0'; - strncpy(serverPort, argv[2], MAXPORTLEN); - serverPort[MAXPORTLEN-1] = '\0'; - //Création de la socket IPv4/TCP - descSock = socket(AF_INET, SOCK_STREAM, 0); - if (descSock == -1) { - perror("Erreur creation socket"); - exit(4); - } - //Récupération des informations sur le serveur - ecode = getaddrinfo(serverName,serverPort,&hints,&res); - if (ecode){ - fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecode)); - exit(3); - } - //Connexion au serveur - ecode = connect(descSock, res->ai_addr, res->ai_addrlen); - if (ecode == -1) { - close(descSock); - freeaddrinfo(res); - perror("Erreur connect"); - exit(5); - } - freeaddrinfo(res); - //Echange de donneés avec le serveur - ecode = read(descSock, buffer, MAXBUFFERLEN); - if (ecode == -1) {perror("Problème de lecture\n"); exit(6);} - buffer[ecode] = '\0'; - printf("MESSAGE RECU DU SERVEUR: \"%s\".\n",buffer); - //Fermeture de la socket - close(descSock); -} - diff --git a/backup/proxy_aure.c b/backup/proxy_aure.c deleted file mode 100644 index 999e131..0000000 --- a/backup/proxy_aure.c +++ /dev/null @@ -1,336 +0,0 @@ -// Bibliothéques -// ============================================== - -#include -#include -#include -#include -#include - - -// Constantes -// ============================================== - -#define SERVADDR "127.0.0.1" // Définition de l'adresse IP d'écoute -#define SERVPORT "4444" // Définition du port d'écoute, si 0 port choisi dynamiquement -#define LISTENLEN 2 // Taille du tampon de demandes de connexions, MAX 2 -#define MAXBUFFERLEN 1024 -#define MAXHOSTLEN 64 -#define MAXPORTLEN 6 - - -// PROCEDURES -// ============================================== - -void decoupeLogin( char *entreeUtilisateur, char *login, char *server ); -void waitingForUser(int *socket,char *buffer,int *n); -void waitingForServer(int *socket,char *buffer,int *n); - - -// MAIN -// ============================================== - -int main( int argc, char *argv[] ) { - - // Variables [ SERVEUR ] >> [ PROXY ] - [ PROXY ] >> [ SERVEUR ] - // ============================================== - - int sockServeur; // Descripteur pour le socket - int fncRet; // Stock le retour des fonctions - struct addrinfo *resBIS; // Résultat de la focntion getaddrinfo - struct addrinfo hintsBIS = {0, AF_INET, SOCK_STREAM, 0, 0, NULL, NULL, NULL}; // Filtra pour le getaddrinfo - char bufferFTP[MAXBUFFERLEN]; - - // Variables [ CLIENT ] >> [ PROXY ] - [ PROXY ] >> [ CLIENT ] - // ============================================== - - char serverAddr[MAXHOSTLEN]; // Adresse du serveur - char serverPort[MAXPORTLEN]; // Port du server - char buffer[MAXBUFFERLEN]; // Tampon pour écrire sur le socket - char bufferRcv[MAXBUFFERLEN]; // Tampon pour écrire sur le socket - int descSockRDV; // Descripteur de socket de rendez-vous - int ecode; // Code retour des fonctions - int descSockCOM; // Descripteur de socket de communication - int n = 0; - int lenRCV = 0; - - - struct addrinfo hints; // Filtre pour la fonction get_addr_info - struct addrinfo *res; // Resultat get_addr_info - struct sockaddr_storage myinfo; // Informations sur la connexion de RDV - struct sockaddr_storage from; // Informations sur le client connecté - - - char entreeUtilisateur[40]; // login@server - char login[20]; // Isoler le login - char serveur[20]; // Isoler le serveur - - - socklen_t len = sizeof( struct sockaddr_storage ); // Variable utilisée pour stocker les longueurs des structures de socket - - pid_t pid; - - // Initialisation de la socket de RDV IPv4/TCP - - descSockRDV = socket( AF_INET, SOCK_STREAM, 0 ); - - // Mise à zéro de la variable hints,entreeUtilisateur,loggin.. - - memset( &hints, 0, sizeof( hints ) ); - memset( entreeUtilisateur, 0, sizeof( entreeUtilisateur ) ); - memset( login, 0, sizeof( login ) ); - memset( serveur, 0, sizeof( serveur ) ); - memset( buffer, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferRcv, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferFTP, 0, sizeof( MAXBUFFERLEN ) ); - - // Initailisation de la variable hints - - hints.ai_flags = AI_PASSIVE; // mode serveur, nous allons utiliser la fonction bind - hints.ai_socktype = SOCK_STREAM; // TCP - hints.ai_family = AF_INET; // IPv4 - - // Récupération des informations du serveur > Machine locale - - ecode = getaddrinfo( SERVADDR, SERVPORT, &hints, &res ); - - // Publication de la socket - - ecode = bind( descSockRDV, res->ai_addr, res->ai_addrlen ); - - ecode = listen( descSockRDV, LISTENLEN ); - - // Attente connexion du client - // Lorsque demande de connexion, creation d'un processus fils et d'un socket de communication avec le client, MAX 2 attentes - - while( 1 == 1 ) { - - descSockCOM = accept( descSockRDV, ( struct sockaddr * ) &from, &len ); - - if( ( pid= fork() ) == 0) { - - close( descSockRDV ); // On ferme le socketRDV on s'occupe seulement de gérer le socket actuel - - strcpy( buffer, "220 Bienvenue sur le proxyFTP de aurehacks\r\n" ); // Echange de données avec le client connecté - - send( descSockCOM, buffer, strlen( buffer ), 0 ); // Ecriture sur le socket - - while(1 == 1) { // Gestion des commandes - - waitingForUser(&descSockCOM,bufferRcv,&n); - - // Gestion de l'authentification - // ============================================== - - if( strstr( bufferRcv,"USER") ) { - - memset( buffer, 0, sizeof( MAXBUFFERLEN ) ); - - decoupeLogin(bufferRcv,login,serveur); // On isole le loggin ainsi que l'IP/URL du serveur - - strcat(buffer,login); // On formate le login - - sockServeur = socket(AF_INET, SOCK_STREAM, 0); - - getaddrinfo(serveur,"21",&hints,&res); - - connect(sockServeur, res->ai_addr, res->ai_addrlen); - - - - // [1] Message de Bienvenue - // ============================================== - - waitingForServer(&sockServeur,bufferFTP,&n); - - // ============================================== - - - - // [2] Envoi de "USER login" - // ============================================== - - send( sockServeur, buffer, strlen( buffer ), 0 ); - send( sockServeur, "\r\n", 2, 0 ); - - waitingForServer(&sockServeur,bufferFTP,&n); - - // ============================================== - - - // [3] Réception du "331 password required" et transmission au client - // ============================================== - - strcpy( bufferFTP, "331 required password\r\n" ); // Cas special SINON ON EN DIRECT send( descSockCOM, strcat(bufferFTP,"\r\n"), strlen( bufferFTP ), 0 ); - - send( descSockCOM, bufferFTP, strlen( bufferFTP ), 0 ); - - waitingForUser(&descSockCOM,bufferRcv,&n); - - // ============================================== - - - - // [4] Réception du "PASS mdp" (mot de passe du client) et transmission au serveur - // ============================================== - - send( sockServeur, bufferRcv, strlen( bufferRcv ), 0 ); - send( sockServeur, "\r\n", 2, 0 ); - - waitingForServer(&sockServeur,bufferFTP,&n); - - // ============================================== - - - - - // [5] Réception du "220 logged in" et transmission au client - // ============================================== - - strcpy( bufferFTP, "220 Logged IN !\r\n" ); // Cas special SINON ON EN DIRECT send( descSockCOM, strcat(bufferFTP,"\r\n"), strlen( bufferFTP ), 0 ); - - send( descSockCOM, bufferFTP, strlen( bufferFTP ), 0 ); - - waitingForUser(&descSockCOM,bufferRcv,&n); - - // ============================================== - - - // On clean les buffers - - memset( buffer, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferRcv, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferFTP, 0, sizeof( MAXBUFFERLEN ) ); - - - } - - - // Gestion du mode actif - // ============================================== - - if( strncmp( bufferRcv,"PORT", 4 ) ) { - - n = 0; - - // On clean les buffers - - memset( buffer, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferRcv, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferFTP, 0, sizeof( MAXBUFFERLEN ) ); - - - } - - // Gestion du mode passif - // ============================================== - - if( strncmp( bufferRcv,"PASSV", 5 ) ) { - - n = 0; - - // On clean les buffers - - memset( buffer, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferRcv, 0, sizeof( MAXBUFFERLEN ) ); - memset( bufferFTP, 0, sizeof( MAXBUFFERLEN ) ); - - - } - - // Gestion de la fermeture de session - // ============================================== - - - if( strncmp( bufferRcv,"QUIT", 4 ) ) { - - break; // On quitte la boucle lorsque que l'on reçoit la commande "QUIT" - } - - } - - freeaddrinfo(res); - - close( descSockCOM ); - close( sockServeur ); - - // Fin du fils - - exit(0); - } - } - - close( descSockRDV ); - - return 0; -} - -// decoupeLogin -// ============================================== - -void decoupeLogin( char *entreeUtilisateur, char *login, char *server ) { - - int i,j = 0; - - for( i=0; i -#include -#include -#include -#include -#define SERVADDR "127.0.0.1" // Définition de l'adresse IP d'écoute -#define SERVPORT "0" // Définition du port d'écoute, si 0 port choisi dynamiquement -#define LISTENLEN 1 // Taille du tampon de demande de connexion -#define MAXBUFFERLEN 1024 -#define MAXHOSTLEN 64 -#define MAXPORTLEN 6 - - -int main(){ - int ecode; // Code retour des fonctions - char serverAddr[MAXHOSTLEN]; // Adresse du serveur - char serverPort[MAXPORTLEN]; // Port du server - int descSockRDV; // Descripteur de socket de rendez-vous - int descSockCOM; // Descripteur de socket de communication - struct addrinfo hints; // Contrôle la fonction getaddrinfo - struct addrinfo *res; // Contient le résultat de la fonction getaddrinfo - struct sockaddr_storage myinfo; // Informations sur la connexion de RDV - struct sockaddr_storage from; // Informations sur le client connecté - socklen_t len; // Variable utilisée pour stocker les - // longueurs des structures de socket - char buffer[MAXBUFFERLEN]; // Tampon de communication entre le client et le serveur - // Initialisation de la socket de RDV IPv4/TCP - descSockRDV = socket(AF_INET, SOCK_STREAM, 0); - if (descSockRDV == -1) { - perror("Erreur création socket RDV\n"); - exit(2); - } - // Publication de la socket au niveau du système - // Assignation d'une adresse IP et un numéro de port - // Mise à zéro de hints - memset(&hints, 0, sizeof(hints)); - // Initailisation de hints - hints.ai_flags = AI_PASSIVE; // mode serveur, nous allons utiliser la fonction bind - hints.ai_socktype = SOCK_STREAM; // TCP - hints.ai_family = AF_INET; // seules les adresses IPv4 seront présentées par - // la fonction getaddrinfo - - // Récupération des informations du serveur - ecode = getaddrinfo(SERVADDR, SERVPORT, &hints, &res); - if (ecode) { - fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecode)); - exit(1); - } - // Publication de la socket - ecode = bind(descSockRDV, res->ai_addr, res->ai_addrlen); - if (ecode == -1) { - perror("Erreur liaison de la socket de RDV"); - exit(3); - } - // Nous n'avons plus besoin de cette liste chainée addrinfo - freeaddrinfo(res); - // Récuppération du nom de la machine et du numéro de port pour affichage à l'écran - - - - - - - - - - len=sizeof(struct sockaddr_storage); - ecode=getsockname(descSockRDV, (struct sockaddr *) &myinfo, &len); - if (ecode == -1) - { - perror("SERVEUR: getsockname"); - exit(4); - } - ecode = getnameinfo((struct sockaddr*)&myinfo, sizeof(myinfo), serverAddr,MAXHOSTLEN, - serverPort, MAXPORTLEN, NI_NUMERICHOST | NI_NUMERICSERV); - if (ecode != 0) { - fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(ecode)); - exit(4); - } - printf("L'adresse d'ecoute est: %s\n", serverAddr); - printf("Le port d'ecoute est: %s\n", serverPort); - - - - - - // Definition de la taille du tampon contenant les demandes de connexion - ecode = listen(descSockRDV, LISTENLEN); - if (ecode == -1) { - perror("Erreur initialisation buffer d'écoute"); - exit(5); - } - while( 1 ){ - - - - len = sizeof(struct sockaddr_storage); - // Attente connexion du client - // Lorsque demande de connexion, creation d'une socket de communication avec le client - descSockCOM = accept(descSockRDV, (struct sockaddr *) &from, &len); - if (descSockCOM == -1){ - perror("Erreur accept\n"); - exit(6); - } - // Echange de données avec le client connecté - strcpy(buffer, "BLABLABLA\n"); - - write(descSockCOM, buffer, strlen(buffer)); - //Fermeture de la connexion - close(descSockCOM); - - } - close(descSockRDV); -} - - - diff --git a/test b/test index 1cf2743e79c04fde083a1d9eb77c9da669504b6a..f5cb98680dc7b261de7e1adb773b7b202919490d 100755 GIT binary patch delta 1759 zcmZuye@s(X6u$ShAXIA$BHB`D3$(AqmKGFbabk%SA5j!hmx@`CScohLPI2PqWUiLk zbS&u6MgQ1z%MxccH^+0Eh|;0P#)zBC7PG}Tb@N9NH#ej6$H2F9AC$#pH|hP}IrpCL zo%5Z0UoUpii(RzyLgFqLk;kqbKZle0?IT9N-7P=#!$Eo}W#WfvpKazFEi3Q7S&=4o zpRz|XpNM<7YL$lA+(d}vs=+ZujqhE>E)TIi}XoJnVk7+ho^hSe| z1q36}8;>PP2nC|wN>YgUA4wZj;UZY6pTc`bH~jNNl6sjDUV&4z@S(ha>URjiGvRu8 zU%!v8h2pdVx)oZ|KBw)FZ78Jg!3x7PdQg1Ju#eJV;4^G=7F1@Kd0iYKv*%MnT54t| zbA)KNacB&1=oUHxS7q9hM-RiEj5+i?{FJd#yG;4aQYX|Ht<(tZ#%g*Rt{J;bJyo80 z3p{4CS_pbqM%=4a`T2SE5qG0nb;jL92JV4q^3n@1!OYT{YsR#o*<7US&Ud*?m5ZvD z3c&;+Y+BX4W=(CAPYAZcH|BIx1hYb2+?Y`B(`h4GJ^W+T2y5&xY&O#qV9YG%bar?t z)6tfTtvbq@6+IV4F$1eH6cs8Rb00ys(6RgKU0J~*xzvlS2iuW1DDNMOS~wQ9MUEO# zrYAqY&{W#o)FcF_3f-p;)~z?Kt2-qG1uS6vfem%*&1w~PwG~uZY5E>tovE?b)Upm` zNf5ego7UH^YH4W3-7qIBJx|AYLjfD65hB6JNajj(4(f%_Zh>VN>xZ1=Cg{l0O|H4c zqC8QbFkNY}VX-Z7(Gc`xIq7RKi0j3_V=0~?|La52hNQ3;tB5|m3A*epbRq1?b`})h zWW2itNv8KQK#kV0eg3}~bs*;3IHo`~3}sKJ@!+!LjHgyN>6Jy^2|i0vNf7z`flB0| z{u456`60ZW(be2wO<*sI6?X_dLg+=7yCIf)16;PuN%m9-%l!v}B|_b}TBc|DSgzda(gWqX|5EDoNq58N>I#$=+D0nb)N( z+;t~rPr{(EEL#IU)oYB~m_cAIpJMQ)n#eMt!@+RLf}9(9mxR7yh2X!F5S=XU=igCs z%a?=Io{!fMBVMpqwaxfNlJ29Ca#fN}BhqV)J;py`s9zmJjMjRfLq)!o-{)usjlknR!#1TE&j}Ha~ zAqDvHDn&ev-zXpA3@CB%RDcGDlNP~V2hUx;0w*0-dI$#Og``}bcEWSHM(Ts*IDZM7 za3-)9=X21Fs}{J1a~UK$d1`_@r;(P!Vke)|iU&I!kHwZu)V6bT)$xK~q3DXAFfIXo zI1Kp9#vC>90mf{GJ}1u&Jb>HI4C;kM*F5@$xY*UE-dSA9DQ#j^@hjtKCY<#+RZ2WE zY$$EOl@%swM@=oeTsV55yv&*S-`~L2vYCmk4!6A4D)yDNDf40svTt-!5Dke@J?qz! zet3EQ6xu2V=kpw@@kPY}j@ZQNh4EC+t`{5a*c~<`#AGrNlM`QE^e)xKDCM(&>jfx! fGEtLGF=z2ON*f`sY94^ImuS~b! delta 1769 zcmY*adrVVT7{BM1m&^({5U7>5+Hyf!d%=kqC##dzV|;aJ6XLcgvlv|zd?0h1iUd(_ zI=0SF7Twq|`(r}3Mdw|NhK!0DJF>;iY0MTgR~_g@*nGq(PW0|Ox75Xx^!wfOz0UXj z&ZC!(l1oQP@aIu}k<*6%!{0(_t@h}o)$Yf-I)~6HnUY+;K~Fyeh!f>~<0dHiOBSl7|6O zSm}GHsx;7~oKw{R*EpnZP7Y1@aYpBdVS z7fQ!ZBb87){xDeuR%0>Q2Co_mh$Qbewh?k2gq%EL1#gZ;;Nv-N)_lTowaaIXw|tZ6+gH|3Hf*kxKqzJ{x&qvlY#d+q|a z#iFOumK9;w>g1xL!c}3{T7B|aS2fpv8Dw(>IRc|CtgJZ}EDLHZCE1-tqGNwjhN(!(x@uYdb-5OZo>pp(`r-%G>HUSpGLK4QBev)MMcHtvYP5@ zDwWXA(;Zct%p0ptQ>h|}o;b9*YLi8ujJrou`x|h*C~x4Hlu{q^SDDvVnrk;A6-l(S zvU*eH%GxzG7?>J%WmRL?S(lOZC9)bgDI6_WWJ?E{@}5zSN9BNl23janEvBC+KLq_0dD~Pn z0p{BBpSx*uab0X3r32ozmCQbPT~!;Kyck0oztdp*g-``cSJ%h3f}$lx#TnGl!0W7j zW32uiaL+b#Traao?jhRjR=R>Cx1$r>xsJqbESG-(&gV{;>AA}ipc|H_-Ix~!m|`Ku z`B>~AmCmuIFW^~-`FYsQ8m+}U-1nJYbB*!yq#x_YtH}?{i$&bRBdMIa357yB@q;L2 zyu7FvTX8Gsm(n!!L{&q(Sy9TLnl{$m49#gUHl2*qkVe!F{DPp6Zrn1?%=u`ugW-|| z`F(|#Y4>9tZ5&KerpYIT_v4_#J{k7dz4iVps(KHD%Oa|J2C?v}sv7auf| zwTQ1_3HuPexWu=J-G~?(IJ%t%& zqdW;~rkKb+kWltP2TBooP(FfwwE7^;DUdptfzk_=P7`?>8k|CYJD$|`1Z;NpnABbT z9DM?9)agD+7@e5JSmZb({;XJI9-POR7P#XSc>X>Z#2l<-hB%i5g8> z73A{Lxbz>^j5&B8-`M39#)N+1SyhuGMKJH&>HIF=iO w#mVn1{)lA9QsU#RjcG{ySWeHam-AmqBuHRk`E=4QuPI+n$oF#3lIHmT0A!-kJpcdz diff --git a/thread/main.c b/thread/main.c deleted file mode 100644 index 989d7b7..0000000 --- a/thread/main.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include - -static void* action1(); -static void* action2(); - - -pthread_t thread1, thread2; -static int bool1 = 1; -static int bool2 = 1; - - - -int main(int argc, char* argv []){ - - pthread_create(&thread1, NULL, &action1, (void*) NULL); - pthread_create(&thread2, NULL, &action2, (void*) NULL); - - printf("THREADS CREATED\n===============\n"); - - sleep(3); - bool1 = 0; - sleep(3); - bool2 = 0; - - - - - return EXIT_SUCCESS; -} - - - - - - -static void* action1(){ - while( bool1 ){ - printf("[THREAD] 1\n"); - sleep(1); - } - - pthread_exit((void*) thread1); -} - -static void* action2(){ - while( bool2 ){ - printf("[THREAD] 2\n"); - sleep(1); - } - - pthread_exit((void*) thread2); -} \ No newline at end of file diff --git a/thread/test b/thread/test deleted file mode 100755 index c7942b766b1ad43e859aaa6d08ba969c9cd9d39e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8915 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 S+%laSF1htxw5LYhqJII3W+HU}