begin process at 2010 02 10 06:49:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > TRANSFERT DE FICHIER VIA LE PROTOCOL TCP/IP

TRANSFERT DE FICHIER VIA LE PROTOCOL TCP/IP


 Information sur la source

Note :
8,43 / 10 - par 7 personnes
8,43 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :transfertdefichier, tcpip, réseaux, linux, abdellah Niveau :Expert Date de création :09/07/2006 Date de mise à jour :19/07/2006 21:47:19 Vu / téléchargé :12 527 / 1 021

Auteur : Abdellah81

Ecrire un message privé
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

 Description

Ce programme permet le transfert de fichier et la recherche d'une chaine de caractere dans un fichier a distance en utilisant le protocol TCP/IP

Source

  • //////////////////////////////////////////////////////////////////////
  • // EL Antri Abdellah //
  • // @-MAIL: El_EMIR_2002@YAHOO.FR //
  • // Universite DJILLALI LIABES SIDI BEL ABBES //
  • // Departement d'informatique //
  • //////////////////////////////////////////////////////////////////////
  • /**************************************************************************/
  • /* Rmarque importante */
  • /* Le serveur créé des fichiers log pour chaque client et un historique */
  • /* des connexions directement dans la racine / par consequent il faut */
  • /* ilo faut avoir les privileges root */
  • /**************************************************************************/
  • //////////////////////////////////////////////////////////////////////////////////////////////
  • // CODE DU SERVEUR //
  • //////////////////////////////////////////////////////////////////////////////////////////////
  • /* Marche sous linux/unix */
  • /* Compilation: cc ftcps.c -o serveur -lpthreqd */
  • /* Execution: ./serveur 1200 */
  • #include <time.h>
  • #include <arpa/inet.h>
  • #include <netdb.h>
  • #include <dirent.h>
  • #include <sys/stat.h>
  • #include <sys/socket.h>
  • #include <sys/types.h>
  • #include <string.h>
  • #include <unistd.h>
  • #include <stdio.h>
  • #define vrai 1
  • #define faux 0
  • // Cette constante permet de specifie la longueur
  • // maximal d'un chemin specifiant un repertoire
  • #define MAX_REP_CHEMIN 2048
  • // Cette constante desgine le nombre de thread autorise a cree
  • #define MAX_THREAD 4
  • // Ddefinie la long maximal du buffer
  • #define MAX_BUF 2048
  • // Structure specaile pour envoyer l'adresse du client
  • // et le descripteur de socket
  • typedef struct comp{int desc; struct sockaddr_in addr;}comp;
  • // Declaraation des variables globales utilise
  • int num_libre;
  • // Tableau d'identificateur
  • pthread_t th_id[MAX_THREAD];
  • // Tableau pour indique les identificateur deja pris
  • int th_occupe [MAX_THREAD];
  • // Fichier contenant l'historique des connexions et des dmandes de connexion
  • FILE *hist;
  • // Declaration des fonctions et procedures
  • // utiliser par notre serveur
  • void section_critique(FILE *);
  • int cree_socket(int, FILE * );
  • char * cherche_fichier(char *, FILE *);
  • void * th_trait(void *);
  • // Procedure principale
  • int main (int argc , char ** argv)
  • {
  • // Descripteur du serveur
  • int serveur;
  • // Nouveau descripteur retourne par accept
  • int nouv_sock;
  • // Adresse du client
  • // Utilise par recvfrom pour recevoir les
  • // informations du client qui a envoye une
  • // demande de connexion
  • struct sockaddr_in client;
  • // Longueur de la structure utilise par client
  • int long_client;
  • // Pour le parcour du tabbleau des identificateurs des thread
  • int i;
  • // utilise pour guarder la Valeur de retour de recvfrom
  • int recue;
  • // Utiliser pour guarder la valeur de retour de sendto
  • int envoye;
  • // Utilise pour la lecture de la demande de connexion
  • char *buf;
  • int long_buf;
  • // Pour lire la date
  • time_t temp;
  • comp special;
  • system("clear");
  • printf("\n Arguments de la ligne de commande ... ");
  • if (argc != 2)
  • {
  • printf(" [FAILED]");
  • printf("\n Usage: serveur num_proto\n");
  • exit(1);
  • }
  • printf(" [OK]");
  • // Creation du fichier historique
  • printf("\n Creation du fichier historique ... ");
  • hist = fopen("historique","w+");
  • if(hist == NULL)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • exit(1);
  • }
  • printf(" [OK]");
  • time(&temp);
  • fprintf(hist," -------------------------------------------------\n");
  • fprintf(hist,"| Ce fichier contient l'historique des connexions |\n");
  • fprintf(hist," -------------------------------------------------\n");
  • fprintf(hist," Date de creation: %s \n ", ctime(&temp) );
  • // Initialisation du buffer
  • // On va essayer d'alloue MAX_BUF octet
  • printf("\n Allocation du buffer ... ");
  • fprintf(hist, "\n Allocation du buffer ... ");
  • buf = (char *)malloc(MAX_BUF);
  • if(buf == NULL)
  • {
  • printf("\n Impossible d'alloue de l'espace pour le buffer");
  • // Sans le buffer on ne peut rien faire
  • exit(1);
  • }
  • printf(" [OK]");
  • fprintf(hist, " [OK]");
  • // Initialisation du tableau des threads
  • printf("\n Initialisation du tableau d'id de thread ... ");
  • fprintf(hist, "\n Initialisation du tableau d'id de thread ... ");
  • for (i = 0; i < 4; i++)
  • {
  • th_occupe[i] = -1;
  • }
  • printf(" [OK]");
  • fprintf(hist, " [OK]");
  • // Initialisation num_libre a 0
  • num_libre = 0;
  • // creation du socket
  • fprintf(hist, "\n Creation de socket sur le port %d... ",atoi(argv[1]));
  • printf("\n Creation de socket sur le port %d... ",atoi(argv[1]));
  • serveur = cree_socket(atoi(argv[1]),hist);
  • if(serveur == -1)
  • {
  • printf(" [FAILED]\n");
  • exit(1);
  • }
  • printf(" [OK]\n");
  • fprintf(hist, " Fixer la file d'attente par 5 ... ");
  • printf(" Fixer la file d'attente par 5 ... ");
  • if(listen(serveur, 5) == -1)
  • {
  • printf(" [FAILED]\n");
  • fprintf(hist, " [FAILED]\n");
  • perror("Cause");
  • exit(1);
  • }
  • printf(" [OK]\n");
  • fprintf(hist, " [OK]\n");
  • printf("\n \t Le serveur va entre dans une boucle infini \n");
  • printf(" \t ========================================= ");
  • freopen("/historique","a+",hist);
  • ////////////////////////////////////////////////////////////
  • // Boucle de gestion des connexions //
  • ///////////////////////////////////////////////////////////
  • while(vrai)
  • {
  • fflush(stdout);//vidage de la sortie standard
  • printf("\n \t Attente des demandes de connexion ");
  • printf("\n");
  • // Le serveur attend une demande de connexion
  • fprintf(hist, "\n Attente de demande de connexion ... ");
  • long_client = sizeof(client);
  • nouv_sock = accept(serveur,(struct sockaddr *) &client,&long_client);
  • if(nouv_sock < 0)
  • {
  • fprintf(hist, " [FAILED]\n");
  • perror("Cause");
  • continue ; // On neglige la requete
  • }
  • fprintf(hist, " [OK]");
  • // On doit recupere les informations du client
  • // qui a demande une connexion
  • printf("\n %s:%u demande la connexion au serveur ...",
  • inet_ntoa(client.sin_addr),ntohs(client.sin_port));
  • fprintf(hist, "\n Une demande de connexion est recue:\n");
  • fprintf(hist, " _==================================_\n");
  • fprintf(hist, "\t * Famille du Socket client: %x\n", ntohs(client.sin_family));
  • fprintf(hist, "\t * Port client: %u\n", ntohs(client.sin_port));
  • fprintf(hist, "\t * IP client: %s\n", inet_ntoa(client.sin_addr));
  • if(num_libre > 3)
  • {
  • strcpy(buf,"NO");
  • long_buf = strlen("NO") + 1;
  • fprintf(hist, "\n Le serveur va envoye un refus de connexion ...");
  • envoye =
  • send(nouv_sock , buf , long_buf , 0);
  • if(envoye < 0)
  • {
  • fprintf(hist, " [FAILED]\n");
  • perror("Cause");
  • continue ;
  • }
  • printf(" [OK]\n");
  • printf("\n Connexion du %s:%u refuse: depacement de capacite \n",
  • inet_ntoa(client.sin_addr),ntohs(client.sin_port));
  • fprintf(hist, " [OK]\n");
  • fprintf(hist,"\n|**************************************************|");
  • fprintf(hist,"\n| DEPACEMENT DE CAPACITE DU SERVEUR |");
  • fprintf(hist, "\n| Connexion du client %s refuse |",
  • inet_ntoa(client.sin_addr));
  • fprintf(hist,"\n|**************************************************|");
  • }
  • else
  • {
  • strcpy(buf,"OK");
  • long_buf = strlen("OK") + 1;
  • fprintf(hist, " Le serveur envoi une acceptation de connexion ... ");
  • envoye =
  • send(nouv_sock,buf,long_buf,0);
  • if(envoye < 0)
  • {
  • fprintf(hist," [FAILED]\n");
  • perror("Cause");
  • continue;
  • }
  • fprintf(hist, " [OK]\n");
  • num_libre ++;
  • // On cherche un identificateur libre
  • for(i = 0; i < 4; i++)
  • if(th_occupe[i] == -1)
  • {
  • // La structure special contient le nom de fichier
  • // la chaine a recherche
  • // et l'adresse du client
  • // creation du thread associe au client
  • fprintf(hist, "\n Creation de thread ... ");
  • special.addr = client;
  • special.desc = nouv_sock;
  • if(
  • pthread_create(&th_id[i],
  • NULL,(void *) th_trait,
  • (void *)&special) != 0
  • )
  • {
  • fprintf(hist, " [FAILED]\n");
  • exit(1);
  • }
  • th_occupe[i] = th_id[i];
  • break;
  • }
  • }
  • freopen("/historique","a+",hist);
  • }// while(true)
  • }
  • // Thread dedie pour la recherche de fichier
  • // Et la recherche des motifs dans un fichier
  • void * th_trait(void *special)
  • {
  • // Descipteur de la socket bidirectionnelle
  • // retourne par accept
  • int serveur;
  • // Descripteur de fichier
  • // utilise par fopen pour la lecture de fichier
  • // cherche dans le cas ou il existe
  • FILE *df;
  • // Descripteur de fichier log pour chaque thread
  • FILE *log;
  • char nom_log[MAX_BUF];
  • // longuer de la structure sockaddr client
  • int long_client;
  • // utilise pour recuperer les valeurs de retour
  • // des fonctions recvfrom et sendto
  • int envoye, recue;
  • // Tampon de lecture ecriture
  • char *buf;
  • // Pour specifie la longueur du bufer
  • int long_buf;
  • // Stocke le nom de fichier envoye par le client
  • char nom_fichier[MAX_REP_CHEMIN];
  • // Stocke le chemin d'acce au fichier
  • // retourne par la fonction recherche_fichier
  • char chemin[MAX_REP_CHEMIN];
  • // Stocke la chaine a cherche dans le fichier
  • char motif[MAX_BUF];
  • // ndice indiquant si le motif a ete trouve ou pas
  • int motif_trouve = -1;
  • // Pour le parcour du tableau de thread
  • int i;
  • // Pour compter le nombre des bloque envoye au client;
  • int num_bloc = 0;
  • // Utilise pour savoir la longueur lu par la fct read
  • int long_lu=0;
  • // Pour recevoir l'arguemt specail qui contient
  • // l'adresse du client et le descripteur de la socket
  • comp *spec = (comp *)special;
  • struct sockaddr_in *client = (struct sockaddr_in *)&spec->addr;
  • serveur = (int)spec->desc;
  • memset(nom_log,0,MAX_BUF);
  • sprintf(nom_log,"serveur-%s-%d.log",
  • inet_ntoa(client->sin_addr),pthread_self());
  • log = fopen(nom_log ,"w+");
  • if(log == NULL)
  • {
  • printf("\n Erreur d'ouverture du fichier log.\n");
  • pthread_exit(1);
  • }
  • fprintf(log," -----------------------------------------------------\n");
  • fprintf(log,"| Fichier log generer automatiquement par le serveur |");
  • fprintf(log,"\n -----------------------------------------------------\n");
  • fprintf(log, "\n Le thread %d va s'occupe de la demande du client %s\n",
  • pthread_self(),inet_ntoa(client->sin_addr));
  • // Essayer d'allouer le buffer
  • buf = (char *)malloc(MAX_BUF);
  • if (buf == NULL)
  • {
  • fprintf(log,"\n Impossible d'alloue le buffer.\n",
  • pthread_self());
  • fprintf
  • (log, "\n Arret du trait associe su client %s:%u \n",
  • inet_ntoa(client->sin_addr),
  • ntohs(client->sin_port)
  • );
  • fclose(log);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • long_buf = MAX_BUF;
  • long_client = sizeof(client);
  • // Attente de messages des clients
  • // On attend un nom de fichier a cherhe
  • fprintf(log, "\n Attente du nom de fichier a cherche ... ",
  • pthread_self());
  • memset(buf,0,strlen(buf));
  • recue =
  • recv(serveur, buf, long_buf , 0);
  • if (recue < 0)
  • {
  • fprintf(log, " [FAILED]");
  • perror("Cause");
  • fclose(log);
  • close(serveur);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • fprintf(log, " [OK]");
  • strcpy(nom_fichier,buf);
  • // On attend la motif a cherche dans le fichier
  • fprintf(log, "\n Attente du motif a cherche ... ",pthread_self());
  • memset(buf,0,strlen(buf));
  • recue =
  • recv(serveur, buf, long_buf , 0);
  • if (recue < 0)
  • {
  • fprintf(log," [FAILED]\n");
  • perror("Cause");
  • fclose(log);
  • close(serveur);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • strcpy(motif, buf);
  • fprintf(log, " [OK]");
  • // Recherche du fichier et recuperation de sont chemin
  • // dans le cas ou il existe
  • fprintf(log, "\n Recherche du fichier %s ... ",nom_fichier);
  • memset(chemin,0,strlen(chemin));
  • strcpy(chemin,cherche_fichier(nom_fichier,log));
  • if(!strcmp(chemin,"NO_EXIST"))
  • {
  • fprintf(log, " [FAILED]\n");
  • fprintf(log, "\n Le fichier cherche n'existe pas. \n ");
  • // On envoi un message pour prevenir le client
  • // que le fichier qu'il a demande n'existe pas
  • // dans le serveur
  • fprintf(log, "\n Envoyer 'NO_EXIST' au client ... ");
  • strcpy(buf,"NO_EXIST");
  • long_buf = strlen("NO_EXIST") + 1;
  • envoye =
  • send(serveur,buf,long_buf,0);
  • if(envoye < 0)
  • {
  • fprintf(log," [FAILED]");
  • perror("Cause");
  • }
  • fprintf(log," [OK]");
  • close(serveur);
  • fclose(log);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • // Si on est arrive ici, ca veut dir que le fichier existe
  • fprintf(log,"\n Le fichier existe et sont chemin est: %s\n",chemin);
  • fprintf(log, "\n Envoyer 'EXIST' au client ... ");
  • strcpy(buf,"EXIST");
  • long_buf = strlen("EXIST") + 1;
  • envoye =
  • send(serveur,buf,long_buf,0);
  • if(envoye < 0)
  • {
  • perror("Cause");
  • close(serveur);
  • fclose(log);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • // On ouvre le fichier pour lecture
  • // la fonction fopen nous retourne un descripteur
  • // qui va etre utilise par la fonction fscanf;
  • df = fopen(chemin,"r+");
  • if(df != NULL)
  • {
  • // Tanque fin de fichier non atteinte on envoi un bloque de donne de taille
  • // strlen(buf) au client qui possede l'adresse client
  • while(!feof(df))
  • {
  • num_bloc ++;
  • if((long_lu = fread(buf,1,MAX_BUF,df)) < 0)
  • {
  • fprintf(log, "\n Erreur de lecture de fichier.\n");
  • perror("Cause");
  • break;
  • }
  • buf[long_lu] = '\0';
  • fprintf(log,"\n Lecture d'un bloque avec succe.");
  • // La recherche du motif dans le buffer courant
  • if(strstr(buf, motif))
  • {
  • motif_trouve = num_bloc;
  • }
  • fprintf(log,
  • "\n\t*********** Envoi du bloc N %d ************",num_bloc);
  • long_buf = strlen(buf)+1;
  • envoye =
  • send(serveur,buf, long_buf, 0);
  • if(envoye < 0)
  • {
  • fprintf(log, "\n Erreur d'envoi de donne. \n");
  • perror("Cause");
  • continue;
  • }
  • fprintf(log,"\n Les donnees on ete envoyees avec succe.");
  • } /* while(!feof(df))*/
  • } /*if(df != NULL)*/
  • else
  • {
  • fprintf(log,
  • "\n Un probleme est survennu lors de l'ouverture du fichier.");
  • perror("Cause");
  • strcpy(buf,"$ERREUR$");
  • long_buf = strlen(buf);
  • send(serveur, (char *) buf, long_buf, 0);
  • fclose(df);
  • fclose(log);
  • close(serveur);
  • section_critique(log);
  • pthread_exit(1);
  • }
  • strcpy(buf, "$FIN$");
  • long_buf = strlen(buf) + 1;
  • printf(" \n Envoye $FIN$ au client %s:%u ... ", inet_ntoa(client->sin_addr),
  • ntohs(client->sin_port));
  • fprintf(log,"\n Envoye $FIN$ au client %s:%u ... ", inet_ntoa(client->sin_addr),
  • ntohs(client->sin_port));
  • envoye =
  • send(serveur, (char *) buf, long_buf, 0);
  • if(envoye < 0)
  • {
  • printf(" [FAILED]");
  • fprintf(log, " [FAILED]");
  • perror("CAUSE");
  • }
  • else
  • {
  • fprintf(log, " [OK]");
  • printf("\n Envoi du fichier a ete termine avec succe");
  • fprintf(log, "\n ------------------------ ");
  • fprintf(log, "\n |Envoi du fichier termine| ");
  • fprintf(log, "\n ------------------------ ");
  • fprintf(log,"\n Envoyer la reponse indiquant si le motif a ete trouve ...");
  • if(motif_trouve >= 0)
  • {
  • memset(buf,0,MAX_BUF);
  • // Le serveur renvoi une reponse indiquant le numero de bloque
  • // qui contient la premiere occurence du motif cherche
  • sprintf(buf,"\n Le motif cherche existe dans le bloc %d:",motif_trouve);
  • long_buf = strlen(buf) + 1;
  • }
  • else
  • {
  • sprintf(buf,"\n Le motif cherche n'existe pas dans le fichier.");
  • long_buf = strlen(buf) + 1;
  • long_buf = strlen("\n Le motif n'existe pas dans le fichier.") + 1;
  • }
  • envoye =
  • send(serveur, buf, long_buf, 0);
  • if(envoye < 0)
  • {
  • fprintf(log, " [FAILED]");
  • }
  • else
  • {
  • fprintf(log, " [OK]");
  • printf(
  • "\n La requete du client %s:%u a ete traite avec succe.", inet_ntoa(client->sin_addr),
  • ntohs(client->sin_port));
  • fprintf(log,
  • "\n La requete du client %s:%u a ete traite avec succe.",
  • inet_ntoa(client->sin_addr),
  • ntohs(client->sin_port));
  • }
  • }
  • fclose(log);
  • fclose(df);
  • close(serveur);
  • section_critique(log);
  • return NULL;
  • }
  • ///////////////////////////////////////////////////////////////////////////
  • // Cette procedure permet de liberer un identificateur de decrementer //
  • // le nombre de clients qui se trouve dans le serveur //
  • /////////////////////////////////////////////////////////////////////////
  • void section_critique(FILE *log)
  • {
  • int i;
  • pthread_mutex_t mut;
  • // Initialisation du verrou
  • // Cette fonction retourne toujour 0
  • fprintf(log, "\n Initialisation du verrou ... ");
  • pthread_mutex_init(&mut, NULL);
  • fprintf(log, " [OK]\n");
  • // Section critique
  • fprintf(log, "\n Debut de la section critique ... ");
  • pthread_mutex_lock(&mut);
  • // Decrement le nombre de client
  • num_libre --;
  • // libere l'identificateur de thread
  • for(i = 0; i < 4; i ++)
  • if(th_occupe[i] == pthread_self())
  • th_occupe[i] = -1;
  • pthread_mutex_unlock(&mut);
  • fprintf(log, "\n Fin de la section critique ... ");
  • // Fin de la section critique
  • }
  • ///////////////////////////////////////////////////////////////////////////
  • // Cette fonction permet de cree un Socket //
  • // Ca valeur de retour est un descripteur dans la table des descripteur //
  • // du processus c'est pour cela qu'il faut un bind pour quelle soit //
  • // definie aupres du systeme //
  • /////////////////////////////////////////////////////////////////////////
  • int cree_socket(int port, FILE *hist)
  • {
  • struct sockaddr_in serveur_addr;
  • int serveur;
  • // Creation du socket
  • serveur = socket(AF_INET, SOCK_STREAM,0);
  • if(serveur < 0)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • return -1;
  • }
  • fprintf(hist, " [OK]");
  • // La famille a laquelle appartient le socket
  • serveur_addr.sin_family = AF_INET;
  • // Adresse specifique qui permet de dir au systeme
  • // que je suis en ecoute sur tout les adresse IP entrantes
  • serveur_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  • // Le port utilise par le socket
  • serveur_addr.sin_port = htons(port);
  • fprintf(hist, "\n Attachement du socket avec une adresse ip/port ... ");
  • // Attachement du socket au systeme
  • if(bind(serveur, (struct sockaddr *) &serveur_addr, sizeof(serveur_addr)) < 0)
  • {
  • fprintf(hist, " [FAILED]");
  • perror("Cause");
  • return -1;
  • }
  • fprintf(hist, " [OK]\n");
  • return serveur;
  • }
  • ///////////////////////////////////////////////////////////////////////////
  • // Cette fonction permet de cherche un fichier //
  • // dans l'arborescence du systemes et de voir si ce fichier //
  • // contient la chaine recherche //
  • ///////////////////////////////////////////////////////////////////////////
  • char * cherche_fichier(char *nom, FILE * log)
  • {
  • static int trouve = faux;
  • // Pointeur sur descripteur de repertoire
  • DIR* rep;
  • // Pointeur sur une entree repertoire
  • struct dirent* entree;
  • // Repertoire de travail courant
  • char rtc[MAX_REP_CHEMIN + 1], sauv[MAX_REP_CHEMIN + 1];
  • //Chemin complet de notre fichier
  • static char chemin[MAX_REP_CHEMIN + 1];
  • // Utilise par stat() pour teste le type des entree
  • struct stat rep_stat;
  • char pile[MAX_REP_CHEMIN][MAX_REP_CHEMIN];
  • int som = 0;
  • strcpy(pile[som],"/");
  • som++;
  • do {
  • som --;
  • strcpy(sauv,pile[som]);
  • if (chdir(sauv) == -1)
  • {
  • fprintf(log, "\n %s",sauv);
  • fprintf(log," \n Erreur lors du changement de repertoire ...");
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • fprintf(log, "\n Recherche dans %s: ", sauv);
  • // ouvrir le repertoir pour lecture
  • rep = opendir(".");
  • if (!rep)
  • {
  • fprintf(log, "\n Impossible de lire le repertoire %s.\n ", sauv);
  • perror("Cause");
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • ///////////////////////////////////////////////////////////////////////
  • // Parcour du repertoire courant ainsi que tout les sous repertoire //
  • ///////////////////////////////////////////////////////////////////////
  • do
  • {
  • entree = readdir(rep);
  • if(entree == NULL)
  • {
  • fprintf(log, "\n Le parcour de %s est termine.\n",sauv);
  • break;
  • }
  • if(entree != NULL)
  • {
  • fprintf(log, "\n Entree courante est: %s", entree->d_name);
  • if ( entree->d_name && !strcmp(entree->d_name,nom))
  • {
  • if (getcwd(rtc, MAX_REP_CHEMIN) == NULL)
  • {
  • perror("Cause");
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • if(strcmp(rtc,"/"))
  • strcat(rtc,"/");
  • strcat(rtc,entree->d_name);
  • strcpy(chemin,rtc);
  • // retourne le chemin d'acce complet du fichier
  • fprintf(log, "\n Le chemin du fichier cherche est: %s\n",
  • chemin);
  • return chemin;
  • }
  • // on evite les repertoires systemes
  • // si vous voulez effectue une recherche dans ses repertoires
  • // il faut les supprimes, mais le temps de recherche augmentera
  • // considerablement
  • if(strcmp(entree->d_name,"Recycled") == 0)
  • continue;
  • if(strcmp(entree->d_name,"dev") == 0)
  • continue;
  • if(strcmp(entree->d_name,"proc") == 0)
  • continue;
  • if(strcmp(entree->d_name,"root") == 0)
  • continue;
  • if(strcmp(entree->d_name,"mnt") == 0)
  • continue;
  • if(strcmp(entree->d_name,"lib") == 0)
  • continue;
  • if(strcmp(entree->d_name,"usr") == 0)
  • continue;
  • if(strcmp(entree->d_name,"etc") == 0)
  • continue;
  • if (strcmp(entree->d_name, ".") == 0)
  • continue;
  • if (strcmp(entree->d_name, "..") == 0)
  • continue;
  • if(entree->d_name != NULL)
  • if ( stat(entree->d_name, &rep_stat) == -1)
  • {
  • continue;
  • }
  • // On teste si l'entre courante est un repertoir
  • if (S_ISDIR(rep_stat.st_mode))
  • {
  • if(som < MAX_REP_CHEMIN )
  • {
  • if (getcwd(rtc, MAX_REP_CHEMIN) == NULL)
  • {
  • perror("Cause");
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • if(strcmp(rtc,"/"))
  • strcat(rtc,"/");
  • strcat(rtc,entree->d_name);
  • if(strcmp(rtc, sauv) != 0) // Eviter les autoreferences
  • {
  • strcpy(pile[som],rtc);
  • som++;
  • }
  • }
  • else
  • {
  • fprintf(log, "\n Pile pleine ... arret de recherche.");
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • } // if (S_DIR)
  • } // if(entree =! null )
  • }while(vrai);
  • closedir(rep);
  • }while(som > 0);
  • strcpy(chemin,"NO_EXIST");
  • return chemin;
  • }
  • //////////////////////////////////////////////////////////////////////////////////////////////
  • // CODE DU CLIENT //
  • //////////////////////////////////////////////////////////////////////////////////////////////
  • /* Marche sous linux/unix */
  • /* Compilation: cc ftcpc.c -o client -lpthread */
  • /* Execution: ./serveur adresse ou nom du serveur */
  • #include <arpa/inet.h>
  • #include <sys/socket.h>
  • #include <sys/types.h>
  • #include <netdb.h>
  • #include <dirent.h>
  • #include <sys/stat.h>
  • #include <string.h>
  • #include <unistd.h>
  • #include <stdio.h>
  • #include <time.h>
  • #define vrai 1
  • #define faux 0
  • // Numero du port du serveur
  • #define SERV_PORT 1200
  • // taille maximal du buffer
  • #define MAX_BUF 2048
  • // Descripteur du fichier cree pour la reception
  • FILE *fd;
  • // Le nom sous lequel le fichier transferer sera garder
  • char nom_fich_recu[MAX_BUF];
  • // Fonctions utilise par le client
  • int cree_socket();
  • ////////////////////////////////////////////////////////////////
  • // Procedure principale //
  • ///////////////////////////////////////////////////////////////
  • int main(int argc, char **argv)
  • {
  • // Buffer pour la lecture et l'ecriture dans le socket
  • char *buf;
  • int long_buf;
  • //Descripteur du client
  • int client;
  • // Utilise par send pour garder la valeur de retour
  • int envoye;
  • // Guarde la valeur de retour de la fonction recv
  • int recue;
  • // Pour la construction de l'adresse du serveur
  • struct sockaddr_in serveur;
  • int long_serveur;
  • // Pour avoir les informations concernant le serveur
  • struct hostent *h;
  • // Variable indiquant qu'on a atteint la fin de fichoer
  • int fin = faux;
  • // Pour le comptage des bloc recu
  • int num_bloc = 0;
  • printf("\n Verfication des arguments de la ligne de commande ... ");
  • if (argc != 2)
  • {
  • printf(" [FAILED]");
  • printf("\n Usage: client nom_serveur \n");
  • exit(1);
  • }
  • printf(" [OK]");
  • // creation du socket
  • printf(" \n Creation du socket ... ");
  • client = cree_socket();
  • if(client < 0)
  • {
  • perror("Cause");
  • exit(1);
  • }
  • // Allocation du buffer
  • printf(" \n Allocation du buffer ... ");
  • buf = (char *)malloc(MAX_BUF);
  • if(buf == NULL)
  • {
  • printf(" [FAILED]\n");
  • perror("Cause");
  • exit(1);
  • }
  • printf(" [OK]\n");
  • // On construit l'adresse du serveur
  • printf("\n Construction de l'adresse du serveur ... ");
  • printf(" [OK]");
  • printf("\n Resolution du nom de serveur %s ... ", argv[1]);
  • h = gethostbyname(argv[1]);
  • if (h == NULL)
  • {
  • printf(" [FAILED]\n");
  • perror("Cause");
  • exit(1);
  • }
  • printf(" [OK]\n");
  • serveur.sin_family = AF_INET;
  • serveur.sin_port = htons(SERV_PORT);
  • struct in_addr *addr_ip_serv = (struct in_addr *)h->h_addr_list[0];
  • printf("\n Adresse ip du serveur est: %s",
  • inet_ntoa(*addr_ip_serv));
  • memcpy((char*)(&serveur.sin_addr.s_addr), h->h_addr_list[0], h->h_length);
  • long_serveur = sizeof(serveur);
  • // On va envoye une demande de connexion au serveur
  • // notre protocole consiste a envoye un message contenant
  • printf("\n Demande de connexion au serveur ... ");
  • if(connect(client, (struct sockaddr *)&serveur , long_serveur) < 0)
  • {
  • printf(" [FAILED] \n");
  • perror("Cause");
  • exit(1);
  • }
  • printf(" [OK]");
  • printf("\n Attente de validation ou refus de connexion ... ");
  • memset(buf,0,strlen(buf));
  • recue =
  • recv(client, buf, long_buf, 0);
  • if (recue < 0)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • exit(1);
  • }
  • if(strcmp(buf,"OK") != 0 && strcmp(buf,"NO") != 0)
  • {
  • printf(" [OK] \n");
  • printf("\n Attendu OK ou NO recue %s.\n", buf);
  • exit(1);
  • }
  • if(strcmp(buf,"NO") == 0)
  • {
  • printf(" [FAILED]");
  • printf("\n\t\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
  • printf("\n\t\t !!! Le serveur est charge !!! ");
  • printf("\n\t\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n");
  • close(client);
  • exit(1);
  • }
  • if(strcmp(buf,"OK") == 0)
  • {
  • printf(" [OK]");
  • printf("\n\t\t ***************************************");
  • printf("\n\t\t *** Le serveur a accepte la demande ***");
  • printf("\n\t\t ***************************************");
  • }
  • // On envoi le nom de fichier a cherche
  • printf("\n Entrer le nom de fichier a cherche: ");
  • scanf("%s",buf);
  • long_buf = strlen(buf) + 1;
  • printf("\n Envoi du nom de fichier ... ");
  • envoye =
  • send(client, buf, long_buf , 0);
  • if(envoye < 0)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • close(client);
  • exit(1);
  • }
  • printf(" [OK]");
  • // On envoi la chaine a recherche dans le fichier
  • printf("\n Entrer le motif a cherche: ");
  • memset(buf,0,strlen(buf));
  • scanf("%s",buf);
  • long_buf = strlen(buf);
  • printf("\n Envoi du motif ... ");
  • envoye =
  • send(client, buf, long_buf , 0);
  • if(envoye < 0)
  • {
  • printf(" [FAILED]\n");
  • perror("Cause");
  • close(client);
  • exit(1);
  • }
  • printf(" [OK]");
  • // Reception de la reponse pour l'existence du fichier
  • printf("\n Attente de la reponse d'existance du fichier ...");
  • memset(buf,0,strlen(buf));
  • long_buf = MAX_BUF;
  • recue =
  • recv(client, buf, long_buf, 0);
  • if (recue < 0)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • close(client);
  • exit(1);
  • }
  • printf(" [OK]");
  • if(!strcmp(buf,"EXIST"))
  • {
  • printf("\n Le serveur a trouve le fichier cherche. \n");
  • }
  • else if(!strcmp(buf,"NO_EXIST"))
  • {
  • printf("\n Le serveur n'a pas reussi a trouve le fichier.\n");
  • close(client);
  • exit(1);
  • }
  • else
  • {
  • printf(" \n Attendu 'EXIST' ou 'NO_EXIST': Recue %s \n",buf);
  • close(client);
  • exit(0);
  • }
  • sprintf(nom_fich_recu, "client%d",getpid());
  • strcat(nom_fich_recu,".log");
  • fd = fopen(nom_fich_recu,"w+");
  • printf("\n *************************************************************** ");
  • printf("\n * Reception du contenu * ");
  • printf("\n *************************************************************** \n");
  • long_buf = MAX_BUF;
  • if(fd == NULL)
  • {
  • printf("\n Impossible de cree un fichier pour la reception des donnees recu");
  • perror("Cause");
  • close(client);
  • exit(1);
  • }
  • else
  • do /* tanque non fin de fichier */
  • {
  • printf("\n Attente d'un bloque de donnee ... ");
  • // Effacer le contenu du buffer
  • long_buf = MAX_BUF;
  • memset(buf,0,MAX_BUF);
  • recue =
  • recv(client, buf, long_buf, 0);
  • if(recue < 0)
  • {
  • printf(" [FAILED]\n");
  • printf("\n Erreur lors de la reception des donnees. \n");
  • perror("Cause");
  • continue;
  • } /* if recue < 0 */
  • printf(" [OK]");
  • printf("%s",buf);
  • if(!strcmp(buf,"$FIN$") || !strcmp(buf, "$ERREUR$"))
  • {
  • fin = vrai;
  • }
  • if(fin == faux) // Car $FIN$, $ERREUR$ ne font pas partie du fichier
  • {
  • num_bloc++;
  • // Ecrire les donnees recu dans le fichier qui porte comme nom
  • // client-num_port
  • printf("\n Ecriture du bloc %d sur le fichier ... ", num_bloc);
  • if(fprintf(fd,"%s",buf) < 0)
  • {
  • printf(" [FAILED]\n");
  • perror("Cause");
  • exit(1);
  • }
  • }
  • printf(" [OK]");
  • }while(fin == faux); /* !feof(df) */
  • // On attend la reponse concernant le motif //
  • printf("\n Attente de la recpetion concernant le motif ... ");
  • long_buf = MAX_BUF;
  • memset(buf,0,MAX_BUF);
  • recue =
  • recv(client, buf, long_buf, 0);
  • if(recue < 0)
  • {
  • printf(" [FAILED]");
  • perror("Cause");
  • }
  • else
  • {
  • printf(" [OK]");
  • printf("\n %s", buf);
  • printf(" \n Le transfert est termine avec succe.");
  • printf(
  • " \n Ouvrir le fichier client%d.log pour voir le resultat de la recpetion.\n" , getpid());
  • }
  • fclose(fd);
  • close(client);
  • printf("\n");
  • return 0;
  • }
  • //////////////////////////////////////////////////////////////////
  • //Procedure aui permet la creation d'une socket //
  • //et elle nou renvoi un descripteur sur le socket ainsi cree //
  • //////////////////////////////////////////////////////////////////
  • int cree_socket()
  • {
  • int client;
  • // Creation du socket
  • client = socket(AF_INET, SOCK_STREAM, 0);
  • if(client < 0)
  • {
  • perror(" [FAILED] \n");
  • return(-1);
  • }
  • printf(" [OK]\n");
  • return client;
  • }
	//////////////////////////////////////////////////////////////////////
	//                       EL Antri Abdellah                          //
	//                    @-MAIL: El_EMIR_2002@YAHOO.FR                 //
	//              Universite DJILLALI LIABES SIDI BEL ABBES           //
	//                     Departement d'informatique                   //
	//////////////////////////////////////////////////////////////////////




/**************************************************************************/
/*				Rmarque importante					  */
/* Le serveur créé des fichiers log pour chaque client et un historique   */
/* des connexions directement dans la racine / par consequent il faut     */
/* ilo faut avoir les privileges root                                     */
/**************************************************************************/

//////////////////////////////////////////////////////////////////////////////////////////////
//							CODE DU SERVEUR                                   //
//////////////////////////////////////////////////////////////////////////////////////////////

/* Marche sous linux/unix */
/* Compilation: cc ftcps.c -o serveur -lpthreqd */
/* Execution: ./serveur 1200                    */



#include <time.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <dirent.h>            
#include <sys/stat.h>           
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>             
#include <unistd.h>           
#include <stdio.h>              

#define vrai 1
#define faux 0

// Cette constante permet de specifie la longueur
// maximal d'un chemin specifiant un repertoire
#define MAX_REP_CHEMIN 2048

// Cette constante desgine le nombre de thread autorise a cree
#define MAX_THREAD 4

// Ddefinie la long maximal du buffer
#define MAX_BUF 2048 

// Structure specaile pour envoyer l'adresse du client
// et le descripteur de socket
typedef struct comp{int desc; struct sockaddr_in addr;}comp;

// Declaraation des variables globales utilise
int num_libre;

// Tableau d'identificateur
pthread_t th_id[MAX_THREAD];

// Tableau pour indique les identificateur deja pris
int th_occupe [MAX_THREAD];

// Fichier contenant l'historique des connexions et des dmandes de connexion
FILE *hist;

// Declaration des fonctions et procedures 
// utiliser par notre serveur

void section_critique(FILE *);
int cree_socket(int, FILE * );
char * cherche_fichier(char *, FILE *);
void * th_trait(void  *);


// Procedure principale 
int main (int argc , char ** argv)
{
// Descripteur du serveur 
int serveur;

// Nouveau descripteur retourne par accept
int nouv_sock;

// Adresse du client
// Utilise par recvfrom pour recevoir les
// informations du client qui a envoye une 
// demande de connexion

struct sockaddr_in client;

// Longueur de la structure utilise par client
int long_client;

// Pour le parcour du tabbleau des identificateurs des thread
int i; 

// utilise pour guarder la Valeur de retour de recvfrom
int recue;

// Utiliser pour guarder la valeur de retour de sendto
int envoye;

// Utilise pour la lecture de la demande de connexion
char *buf;
int long_buf;

// Pour lire la date
time_t temp;

comp special;


system("clear");
printf("\n Arguments de la ligne de commande ... ");

if (argc != 2)
   {
   printf(" [FAILED]");
   printf("\n Usage: serveur num_proto\n");
   exit(1);
   }
printf(" [OK]");

// Creation du fichier historique
printf("\n Creation du fichier historique ... ");
hist = fopen("historique","w+");
if(hist == NULL)
  {
  printf(" [FAILED]");	  
  perror("Cause");
  exit(1);
  }	  
printf(" [OK]");	  

time(&temp);
fprintf(hist," -------------------------------------------------\n");
fprintf(hist,"| Ce fichier contient l'historique des connexions |\n");
fprintf(hist," -------------------------------------------------\n");

fprintf(hist," Date de creation: %s \n ", ctime(&temp) );
// Initialisation du buffer
// On va essayer d'alloue MAX_BUF octet

printf("\n Allocation du buffer ... ");
fprintf(hist, "\n Allocation du buffer ... ");
buf = (char *)malloc(MAX_BUF);
if(buf == NULL)
  {
  printf("\n Impossible d'alloue de l'espace pour le buffer");
  // Sans le buffer on ne peut rien faire
  exit(1);
  }
printf(" [OK]");
fprintf(hist, " [OK]");
       
// Initialisation du tableau des threads
printf("\n Initialisation du tableau d'id de thread ... ");
fprintf(hist, "\n Initialisation du tableau d'id de thread ... ");
for (i = 0; i < 4; i++)
   {
   th_occupe[i] = -1;
   }
printf(" [OK]");
fprintf(hist, " [OK]");

// Initialisation num_libre a 0
num_libre = 0;

// creation du socket
fprintf(hist, "\n Creation de socket sur le port %d... ",atoi(argv[1]));
printf("\n Creation de socket sur le port %d... ",atoi(argv[1]));
serveur = cree_socket(atoi(argv[1]),hist);
if(serveur == -1)
  {
  printf(" [FAILED]\n");	  
  exit(1);
  }

printf(" [OK]\n");	  

fprintf(hist, " Fixer la file d'attente par 5 ... ");
printf(" Fixer la file d'attente par 5 ... ");
if(listen(serveur, 5) == -1)
  {
  printf(" [FAILED]\n");
  fprintf(hist, " [FAILED]\n");
  perror("Cause");
  exit(1);
  }
printf(" [OK]\n");
fprintf(hist, " [OK]\n");
printf("\n \t  Le serveur va entre dans une boucle infini  \n");
printf("   \t  =========================================   ");
freopen("/historique","a+",hist);	

      ////////////////////////////////////////////////////////////
      //         Boucle de gestion des connexions               //
      ///////////////////////////////////////////////////////////

while(vrai)
{
fflush(stdout);//vidage de la sortie standard

printf("\n \t        Attente des demandes de connexion      ");
printf("\n");

// Le serveur attend une demande de connexion 
fprintf(hist, "\n Attente de demande de connexion ... ");
long_client = sizeof(client);
nouv_sock = accept(serveur,(struct sockaddr *) &client,&long_client);
if(nouv_sock < 0)
  {
  fprintf(hist, " [FAILED]\n");	  
  perror("Cause");
  continue ; // On neglige la requete
  }	  
fprintf(hist, " [OK]");   

// On doit recupere les informations du client
// qui a demande une connexion
printf("\n %s:%u demande la connexion au serveur ...", 
	inet_ntoa(client.sin_addr),ntohs(client.sin_port));
fprintf(hist, "\n  Une demande de connexion est recue:\n");
fprintf(hist, "  _==================================_\n");
fprintf(hist, "\t * Famille du Socket client: %x\n", ntohs(client.sin_family));
fprintf(hist, "\t * Port client: %u\n", ntohs(client.sin_port));
fprintf(hist, "\t * IP client:  %s\n", inet_ntoa(client.sin_addr));



if(num_libre > 3)
   {
   strcpy(buf,"NO");
   long_buf = strlen("NO") + 1;
   fprintf(hist, "\n Le serveur va envoye un refus de connexion ...");
   envoye =
            send(nouv_sock , buf , long_buf , 0);
   if(envoye < 0)
     {
      fprintf(hist, " [FAILED]\n");
      perror("Cause");
      continue ;
      }
   printf(" [OK]\n");
   printf("\n Connexion du %s:%u refuse: depacement de capacite \n",
                 inet_ntoa(client.sin_addr),ntohs(client.sin_port));
   fprintf(hist, " [OK]\n");
   fprintf(hist,"\n|**************************************************|");
   fprintf(hist,"\n|        DEPACEMENT DE  CAPACITE  DU SERVEUR       |"); 
   fprintf(hist, "\n|     Connexion du client %s refuse       |", 
          inet_ntoa(client.sin_addr));
   fprintf(hist,"\n|**************************************************|");
   } 
    else
        {
        strcpy(buf,"OK");
        long_buf = strlen("OK") + 1;
	fprintf(hist, " Le serveur envoi une acceptation de connexion ... ");
        envoye =
                 send(nouv_sock,buf,long_buf,0);
        if(envoye < 0)
          {
           fprintf(hist," [FAILED]\n");
           perror("Cause");
           continue;
          }
        fprintf(hist, " [OK]\n");
        num_libre ++;

	// On cherche un identificateur libre
        for(i = 0; i < 4; i++)
	    if(th_occupe[i]  == -1)
	       {
	        // La structure special contient le nom de fichier
		// la chaine a recherche
		// et l'adresse du client
		// creation du thread associe au client
		fprintf(hist, "\n Creation de thread ... ");
		special.addr = client;
		special.desc = nouv_sock;
                if(
		   pthread_create(&th_id[i], 
                		    NULL,(void *) th_trait, 
	                 	     (void *)&special)  != 0
		   )
		   {
		   fprintf(hist, " [FAILED]\n");
		   exit(1);
		   }
	       th_occupe[i] = th_id[i];   
               break;
               }
        } 
 freopen("/historique","a+",hist);	
 }// while(true)

}

// Thread  dedie  pour la recherche de fichier
// Et la recherche des motifs dans un fichier

void * th_trait(void *special)
{

// Descipteur de la socket bidirectionnelle
// retourne par accept
int serveur;

// Descripteur de fichier 
// utilise par fopen pour la lecture de fichier
// cherche dans le cas ou il existe

FILE *df;

// Descripteur de fichier log pour chaque thread
FILE *log;
char nom_log[MAX_BUF];


// longuer de la structure sockaddr client
int long_client;

// utilise pour recuperer les valeurs de retour
// des fonctions recvfrom et sendto
int envoye, recue;

// Tampon de lecture ecriture
char *buf;

// Pour specifie la longueur du bufer
int long_buf;

// Stocke le nom de fichier envoye par le client
char nom_fichier[MAX_REP_CHEMIN];

// Stocke le chemin d'acce au fichier
// retourne par la fonction recherche_fichier
char chemin[MAX_REP_CHEMIN];

// Stocke la chaine a cherche dans le fichier
char motif[MAX_BUF];
// ndice indiquant si le motif a ete trouve ou pas
int motif_trouve = -1;

// Pour le parcour du tableau de thread
int i;

// Pour compter le nombre des bloque envoye au client;
int num_bloc = 0;

// Utilise pour savoir la longueur lu par la fct read
int long_lu=0;
 
// Pour recevoir l'arguemt specail qui contient
// l'adresse du client et le descripteur de la socket
comp *spec = (comp *)special;

struct sockaddr_in *client = (struct sockaddr_in *)&spec->addr; 

serveur = (int)spec->desc;


memset(nom_log,0,MAX_BUF);
sprintf(nom_log,"serveur-%s-%d.log", 
       inet_ntoa(client->sin_addr),pthread_self());
log = fopen(nom_log ,"w+");
if(log == NULL)
   {
   printf("\n Erreur d'ouverture du fichier log.\n");
   pthread_exit(1);
   }

fprintf(log," -----------------------------------------------------\n");
fprintf(log,"| Fichier log generer automatiquement par le serveur |");
fprintf(log,"\n -----------------------------------------------------\n");

fprintf(log, "\n Le thread %d va s'occupe de la demande du client  %s\n",
       pthread_self(),inet_ntoa(client->sin_addr));

// Essayer d'allouer le buffer
buf = (char *)malloc(MAX_BUF); 
if (buf == NULL)
    {
    fprintf(log,"\n Impossible d'alloue le buffer.\n", 
           pthread_self());
    fprintf
	  (log, "\n Arret du trait associe su client %s:%u \n",
          inet_ntoa(client->sin_addr),
	  ntohs(client->sin_port)
	  );
    fclose(log);
    section_critique(log);
    pthread_exit(1);
    }
 
long_buf = MAX_BUF; 
long_client = sizeof(client);


// Attente de messages des clients
// On attend un nom de fichier a cherhe 
fprintf(log, "\n Attente du nom de fichier a cherche ... ",
        pthread_self()); 
memset(buf,0,strlen(buf));
recue = 
        recv(serveur, buf, long_buf , 0);
if (recue < 0)
    {
      fprintf(log, " [FAILED]");
      perror("Cause");
      fclose(log);
      close(serveur);
      section_critique(log);
      pthread_exit(1);
    }
  
fprintf(log, " [OK]");
strcpy(nom_fichier,buf);

// On attend la motif a cherche dans le fichier

 fprintf(log, "\n Attente du motif a cherche ... ",pthread_self());
 memset(buf,0,strlen(buf));
 recue = 
	 recv(serveur, buf, long_buf , 0);
 if (recue < 0)
    {
      fprintf(log," [FAILED]\n");
      perror("Cause");
      fclose(log);
      close(serveur);
      section_critique(log);
      pthread_exit(1);
    }
 strcpy(motif, buf);
 fprintf(log, " [OK]"); 

// Recherche du fichier et recuperation de sont chemin
// dans le cas ou il existe
 fprintf(log, "\n Recherche du fichier %s ... ",nom_fichier);
 memset(chemin,0,strlen(chemin));

 strcpy(chemin,cherche_fichier(nom_fichier,log));
 if(!strcmp(chemin,"NO_EXIST"))
   {
   fprintf(log, " [FAILED]\n");
   fprintf(log, "\n Le fichier cherche n'existe pas. \n ");
   // On envoi un message pour prevenir le client
   // que le fichier qu'il a demande n'existe pas
   // dans le serveur
   fprintf(log, "\n Envoyer  'NO_EXIST' au client ... ");
   strcpy(buf,"NO_EXIST");
   long_buf = strlen("NO_EXIST") + 1;
   envoye =
           send(serveur,buf,long_buf,0);
    if(envoye < 0)
       {
       fprintf(log," [FAILED]");
       perror("Cause");
       }
  fprintf(log," [OK]");
  close(serveur);
  fclose(log);
  section_critique(log);
  pthread_exit(1);
  }	


// Si on est arrive ici, ca veut dir que le fichier existe
fprintf(log,"\n Le fichier existe et sont chemin est: %s\n",chemin);


fprintf(log, "\n Envoyer 'EXIST' au client ... ");
strcpy(buf,"EXIST");
long_buf = strlen("EXIST") + 1;

envoye =
         send(serveur,buf,long_buf,0);
if(envoye < 0)
  {
  perror("Cause");
  close(serveur);
  fclose(log);
  section_critique(log);
  pthread_exit(1);
  }

// On ouvre le fichier pour lecture 
// la fonction fopen nous retourne un descripteur 
// qui va etre utilise par la fonction fscanf;

df = fopen(chemin,"r+");

if(df != NULL)
  {

   // Tanque fin de fichier non atteinte on envoi un bloque de donne de taille
   // strlen(buf) au client qui possede l'adresse client
   while(!feof(df))
      {
      num_bloc ++; 
      if((long_lu = fread(buf,1,MAX_BUF,df)) < 0)
         {
         fprintf(log, "\n Erreur de lecture de fichier.\n");
         perror("Cause");
         break;         
         }
      buf[long_lu] = '\0';
      fprintf(log,"\n Lecture d'un bloque avec succe.");
      // La recherche du motif dans le buffer courant
      if(strstr(buf, motif))
	 {
	 motif_trouve = num_bloc;	 
	 }
       
        fprintf(log,
              "\n\t*********** Envoi du bloc N %d ************",num_bloc);
	long_buf = strlen(buf)+1;
        envoye = 
 	         send(serveur,buf, long_buf, 0);
        if(envoye < 0)
           {
           fprintf(log, "\n Erreur d'envoi de donne. \n");
           perror("Cause");
           continue;
           }
        fprintf(log,"\n Les donnees on ete envoyees avec succe.");
        

     }                 /* while(!feof(df))*/  

  }                    /*if(df != NULL)*/

   else 
        {
        fprintf(log, 
              "\n Un probleme est survennu lors de l'ouverture du fichier.");
        perror("Cause");
        strcpy(buf,"$ERREUR$");
        long_buf = strlen(buf);
        send(serveur, (char *) buf, long_buf, 0);
        fclose(df);
        fclose(log);
        close(serveur);
        section_critique(log);
        pthread_exit(1);
        }

strcpy(buf, "$FIN$");
long_buf = strlen(buf) + 1;
printf(" \n Envoye $FIN$ au client %s:%u ... ", inet_ntoa(client->sin_addr), 
		ntohs(client->sin_port));
fprintf(log,"\n Envoye $FIN$ au client %s:%u ... ", inet_ntoa(client->sin_addr),
		ntohs(client->sin_port));
envoye =
          send(serveur, (char *) buf, long_buf, 0);       

if(envoye < 0)
  {
  printf(" [FAILED]");
  fprintf(log, " [FAILED]");
  perror("CAUSE");
  }
  else 
    {
    fprintf(log, " [OK]");
    printf("\n Envoi du fichier a ete termine avec succe");
    fprintf(log, "\n  ------------------------  ");
    fprintf(log, "\n |Envoi du fichier termine| ");
    fprintf(log, "\n  ------------------------  ");

    fprintf(log,"\n Envoyer la reponse indiquant si le motif a ete trouve ...");
    if(motif_trouve >= 0)
     {
     memset(buf,0,MAX_BUF);
     // Le serveur renvoi une reponse indiquant le numero de bloque
     // qui contient la premiere occurence du motif cherche
     sprintf(buf,"\n Le motif cherche existe dans le bloc %d:",motif_trouve);
     long_buf = strlen(buf) + 1;
     }
      else 
          {
          sprintf(buf,"\n Le motif cherche n'existe pas dans le fichier.");
          long_buf = strlen(buf) + 1;
          long_buf = strlen("\n Le motif n'existe pas dans le fichier.") + 1;
          }
     envoye =
	      send(serveur, buf, long_buf, 0);
     if(envoye < 0)
	{
	fprintf(log, " [FAILED]");
	}
        else
	     {	
              fprintf(log, " [OK]");	      
	      printf(
		      "\n La requete du client %s:%u a ete traite avec succe.", inet_ntoa(client->sin_addr),
			    ntohs(client->sin_port));
              fprintf(log,
   		    "\n La requete du client %s:%u a ete traite avec succe.", 
                              inet_ntoa(client->sin_addr),
			      ntohs(client->sin_port));
             }
     }
fclose(log);
fclose(df);
close(serveur);
section_critique(log);

return NULL;
}


///////////////////////////////////////////////////////////////////////////
// Cette procedure permet de liberer un identificateur de decrementer   //
// le nombre de clients qui se trouve dans le serveur                   //
/////////////////////////////////////////////////////////////////////////

void section_critique(FILE *log)               
{
int i;
pthread_mutex_t mut;

// Initialisation du verrou
// Cette fonction retourne toujour 0
fprintf(log, "\n Initialisation du verrou ... ");  
pthread_mutex_init(&mut, NULL);
fprintf(log, " [OK]\n");


// Section critique
fprintf(log, "\n Debut de la section critique ... ");  
pthread_mutex_lock(&mut);
// Decrement le nombre de client
num_libre --;
// libere l'identificateur de thread
for(i = 0; i < 4; i ++)
   if(th_occupe[i] == pthread_self())
     th_occupe[i] = -1;
pthread_mutex_unlock(&mut);       
fprintf(log, "\n Fin de la section critique ... ");  
// Fin de la section critique
}

///////////////////////////////////////////////////////////////////////////
// Cette fonction permet de cree un Socket                               //
// Ca valeur de retour est un descripteur dans la table des descripteur  //
// du processus c'est pour cela qu'il faut un bind pour quelle soit     //
// definie aupres du systeme                                            // 
/////////////////////////////////////////////////////////////////////////


int cree_socket(int port, FILE *hist)
{

  struct sockaddr_in serveur_addr;
  int serveur;
  
  // Creation du socket
  serveur = socket(AF_INET, SOCK_STREAM,0);
  if(serveur < 0)
    {
      printf(" [FAILED]");
      perror("Cause");
      return -1;
    }
  fprintf(hist, " [OK]");
  // La famille a laquelle appartient le socket
  serveur_addr.sin_family = AF_INET;
  
  // Adresse specifique qui permet de dir au systeme
  // que je suis en ecoute sur tout les adresse IP entrantes
  serveur_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  
  // Le port utilise par le socket
  serveur_addr.sin_port = htons(port);
 
 fprintf(hist, "\n Attachement du socket avec une adresse ip/port ... ");
 // Attachement du socket au systeme
  if(bind(serveur, (struct sockaddr *) &serveur_addr, sizeof(serveur_addr)) < 0)
    {
      fprintf(hist, " [FAILED]");
      perror("Cause");
      return -1;
    }
  fprintf(hist, " [OK]\n"); 
  return serveur;
}


///////////////////////////////////////////////////////////////////////////
// Cette fonction permet de cherche un fichier                           //
// dans l'arborescence du systemes et de voir si ce fichier              //
// contient la chaine recherche                                          //
///////////////////////////////////////////////////////////////////////////

char * cherche_fichier(char *nom, FILE * log)
{

    static int trouve = faux;

    // Pointeur sur descripteur de repertoire          
    DIR* rep;                            

    // Pointeur sur une entree repertoire              
    struct dirent* entree; 

    // Repertoire de travail courant                  
    char rtc[MAX_REP_CHEMIN + 1], sauv[MAX_REP_CHEMIN + 1];
    //Chemin complet de notre fichier
    static char chemin[MAX_REP_CHEMIN + 1];

    // Utilise par stat() pour teste le type des entree   
    struct stat rep_stat;                

     char pile[MAX_REP_CHEMIN][MAX_REP_CHEMIN];
     int som = 0;
     

strcpy(pile[som],"/");
som++;
do {
   som --;
   strcpy(sauv,pile[som]);
   if  (chdir(sauv) == -1)
    {
    fprintf(log, "\n %s",sauv);
    fprintf(log," \n Erreur lors du changement de repertoire ...");
    strcpy(chemin,"NO_EXIST");
    return chemin;
    }
      
   fprintf(log, "\n Recherche dans %s: ", sauv);
   
   // ouvrir le repertoir pour lecture 
   rep = opendir(".");
   if (!rep) 
        {
	fprintf(log, "\n Impossible de lire le repertoire %s.\n ", sauv);
	perror("Cause");
	strcpy(chemin,"NO_EXIST");
	return chemin;
        } 

    ///////////////////////////////////////////////////////////////////////
    //  Parcour du repertoire courant ainsi que tout les sous repertoire //
    ///////////////////////////////////////////////////////////////////////    

    do
    {
     entree = readdir(rep);
     if(entree == NULL)
       {
       fprintf(log, "\n Le parcour de %s est termine.\n",sauv);
       break;
       }  

     if(entree != NULL)
        {
        fprintf(log, "\n Entree courante est: %s", entree->d_name);
	
	if ( entree->d_name && !strcmp(entree->d_name,nom)) 
            {
            if (getcwd(rtc, MAX_REP_CHEMIN) == NULL) 
                {
	         perror("Cause");
	         strcpy(chemin,"NO_EXIST");
	         return chemin;
                 }
	    if(strcmp(rtc,"/"))
	        strcat(rtc,"/"); 
	    strcat(rtc,entree->d_name);
	    strcpy(chemin,rtc);
	    // retourne le chemin d'acce complet du fichier 
             fprintf(log, "\n Le chemin du fichier cherche est: %s\n",
                 chemin);
 	     return chemin;
	    }
        
        // on evite les repertoires systemes
        // si vous voulez effectue une recherche dans ses repertoires
        // il faut les supprimes, mais le temps de recherche augmentera
        // considerablement
        if(strcmp(entree->d_name,"Recycled") == 0)
            continue;
        if(strcmp(entree->d_name,"dev") == 0)
            continue;
        if(strcmp(entree->d_name,"proc") == 0)
            continue;
        if(strcmp(entree->d_name,"root") == 0)
            continue;
        if(strcmp(entree->d_name,"mnt") == 0)
            continue;
        if(strcmp(entree->d_name,"lib") == 0)
            continue;
        if(strcmp(entree->d_name,"usr") == 0)
            continue;
        if(strcmp(entree->d_name,"etc") == 0)
            continue;
	if (strcmp(entree->d_name, ".") == 0)
	    continue;
	if (strcmp(entree->d_name, "..") == 0)
	    continue;

        if(entree->d_name != NULL)
          if ( stat(entree->d_name, &rep_stat) == -1)
             {
             continue;
             }
	// On teste si l'entre courante est un repertoir
        if (S_ISDIR(rep_stat.st_mode))
           {
	    if(som < MAX_REP_CHEMIN )
	        {
                if (getcwd(rtc, MAX_REP_CHEMIN) == NULL) 
                   {
	           perror("Cause");
	           strcpy(chemin,"NO_EXIST");
	           return chemin;
                   }
		if(strcmp(rtc,"/"))
		   strcat(rtc,"/"); 
		strcat(rtc,entree->d_name);
		if(strcmp(rtc, sauv) != 0) // Eviter les autoreferences
		  {
	   	  strcpy(pile[som],rtc);
	          som++;
		  }
	        }
	        else
		   {
		   fprintf(log, "\n Pile pleine ... arret de recherche.");
                   strcpy(chemin,"NO_EXIST");
	           return chemin;
		   }
         } // if (S_DIR)
       } // if(entree =! null )
    }while(vrai); 
  closedir(rep);
  }while(som > 0);

strcpy(chemin,"NO_EXIST");
return chemin;
}




//////////////////////////////////////////////////////////////////////////////////////////////
//							CODE DU CLIENT                                    //
//////////////////////////////////////////////////////////////////////////////////////////////

/* Marche sous linux/unix                         */
/* Compilation: cc ftcpc.c -o client -lpthread    */
/* Execution: ./serveur adresse ou nom du serveur */

#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <dirent.h>            
#include <sys/stat.h>           
#include <string.h>             
#include <unistd.h>           
#include <stdio.h>              
#include <time.h>              

#define vrai 1
#define faux 0

// Numero du port du serveur
#define SERV_PORT 1200

// taille maximal du buffer
#define MAX_BUF 2048

// Descripteur du fichier cree pour la reception
FILE *fd;

// Le nom sous lequel le fichier transferer sera garder
char nom_fich_recu[MAX_BUF];

// Fonctions utilise par le client
int cree_socket();


////////////////////////////////////////////////////////////////
//                 Procedure principale                       //
///////////////////////////////////////////////////////////////

int main(int argc, char **argv)
{
// Buffer pour la lecture et l'ecriture dans le socket
char *buf;
int long_buf;

//Descripteur du client
int client;

// Utilise par send pour garder la valeur de retour
int envoye;

// Guarde la valeur de retour de la fonction recv
int recue;

// Pour la construction de l'adresse du serveur
struct sockaddr_in serveur;
int long_serveur;

// Pour avoir les informations concernant le serveur
struct hostent *h;

// Variable indiquant qu'on a atteint la fin de fichoer
int fin = faux;

// Pour le comptage des bloc recu
int num_bloc = 0;

printf("\n Verfication des arguments de la ligne de commande ... ");
if (argc != 2)
   {
   printf(" [FAILED]");
   printf("\n Usage:  client nom_serveur \n");
   exit(1);
   }
printf(" [OK]");   

// creation du socket
printf(" \n Creation du socket ... ");
client = cree_socket();
if(client < 0)
 {
  perror("Cause");
  exit(1);
 }

// Allocation du buffer
printf(" \n Allocation du buffer ... ");
buf = (char *)malloc(MAX_BUF);
if(buf == NULL)
  {
  printf(" [FAILED]\n");  
  perror("Cause");
  exit(1);
  }	
printf(" [OK]\n");


// On construit l'adresse du serveur
printf("\n Construction de l'adresse du serveur ... ");


printf(" [OK]");
printf("\n Resolution du nom de serveur %s ... ", argv[1]);
h = gethostbyname(argv[1]);
if (h == NULL)
    {
    printf(" [FAILED]\n");
    perror("Cause");
    exit(1);
    }
printf(" [OK]\n");

serveur.sin_family = AF_INET;
serveur.sin_port = htons(SERV_PORT);

struct in_addr *addr_ip_serv = (struct in_addr *)h->h_addr_list[0];

printf("\n Adresse ip du serveur est: %s", 
	inet_ntoa(*addr_ip_serv));

memcpy((char*)(&serveur.sin_addr.s_addr), h->h_addr_list[0], h->h_length);
long_serveur = sizeof(serveur);

// On va envoye une demande de connexion au serveur
// notre protocole consiste a envoye un message contenant
 
printf("\n Demande de connexion au serveur ... ");
if(connect(client, (struct sockaddr *)&serveur , long_serveur) < 0)
  {
  printf(" [FAILED] \n");	  
  perror("Cause");
  exit(1);
  }	  
printf(" [OK]");   


printf("\n Attente de validation  ou refus de connexion ... ");

memset(buf,0,strlen(buf));

recue = 
	recv(client, buf, long_buf, 0);

if (recue < 0)
   {
   printf(" [FAILED]");
   perror("Cause");
   exit(1); 
   }   

if(strcmp(buf,"OK") != 0 && strcmp(buf,"NO") != 0)
  {
  printf(" [OK] \n");
  printf("\n Attendu OK ou NO recue %s.\n", buf);
  exit(1);
  }

if(strcmp(buf,"NO") == 0)
  {
  printf(" [FAILED]");
  printf("\n\t\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   ");   
  printf("\n\t\t !!! Le serveur est charge  !!!   ");   
  printf("\n\t\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n");   
  close(client);
  exit(1);
  }

if(strcmp(buf,"OK") == 0)
  {
  printf(" [OK]");
  printf("\n\t\t ***************************************");   
  printf("\n\t\t *** Le serveur a accepte la demande ***");   
  printf("\n\t\t ***************************************");   
  }


// On envoi le nom de fichier a cherche 
printf("\n Entrer le nom de fichier a cherche: ");
scanf("%s",buf);
long_buf = strlen(buf) + 1;

printf("\n Envoi du nom de fichier ... "); 
envoye =
       	send(client, buf, long_buf , 0);
 
if(envoye < 0)
   {
   printf(" [FAILED]");
   perror("Cause");
   close(client);
   exit(1);
   }	
printf(" [OK]"); 


// On envoi la chaine a recherche  dans le fichier  

printf("\n Entrer le motif a cherche: ");
memset(buf,0,strlen(buf));
scanf("%s",buf);
long_buf = strlen(buf);

printf("\n Envoi du motif ... "); 
envoye =
       	send(client, buf, long_buf , 0);
 
if(envoye < 0)
   {
   printf(" [FAILED]\n");
   perror("Cause");
   close(client);
   exit(1);
   }	
printf(" [OK]"); 

// Reception de la reponse pour l'existence du fichier
printf("\n Attente de la reponse d'existance du fichier ...");
memset(buf,0,strlen(buf));
long_buf = MAX_BUF;
recue = 
	recv(client, buf, long_buf, 0);
if (recue < 0)
   {
   printf(" [FAILED]");
   perror("Cause");
   close(client);
   exit(1); 
   }   
printf(" [OK]");
if(!strcmp(buf,"EXIST"))
  {
  printf("\n Le serveur a trouve le fichier cherche. \n");  
  }
  else if(!strcmp(buf,"NO_EXIST"))
     {
     printf("\n Le serveur n'a pas reussi a trouve le fichier.\n");
     close(client);
     exit(1);
     }
    else
       {
       printf(" \n Attendu 'EXIST' ou 'NO_EXIST': Recue %s \n",buf);
       close(client);
       exit(0);
       }

sprintf(nom_fich_recu, "client%d",getpid());
strcat(nom_fich_recu,".log");
fd = fopen(nom_fich_recu,"w+");
printf("\n ***************************************************************   ");
printf("\n *                    Reception du contenu                     *   ");
printf("\n *************************************************************** \n");
long_buf = MAX_BUF;
if(fd == NULL)
  {
  printf("\n Impossible de cree un fichier pour la reception des donnees recu");
  perror("Cause");
  close(client);
  exit(1);
  }
else 
  do /* tanque non fin de fichier */
    {
    printf("\n Attente d'un bloque de donnee ... ");

    // Effacer le contenu du buffer
    long_buf = MAX_BUF;
    memset(buf,0,MAX_BUF);
    recue = 
	    recv(client, buf, long_buf, 0);

    if(recue < 0)
      {
       printf(" [FAILED]\n");
       printf("\n Erreur lors de la reception des donnees. \n");
       perror("Cause");
       continue;
       } /* if recue < 0 */
    
    printf(" [OK]");
    printf("%s",buf);
    
    if(!strcmp(buf,"$FIN$")  || !strcmp(buf, "$ERREUR$"))
       {
	fin = vrai;
       }   


    if(fin == faux) // Car $FIN$, $ERREUR$ ne font pas partie du fichier 
      {
      num_bloc++;	      
      
      // Ecrire les donnees recu dans le fichier qui porte comme nom
      // client-num_port
      
      printf("\n Ecriture du bloc %d sur le fichier ... ", num_bloc);
      if(fprintf(fd,"%s",buf) < 0)
        {
         printf(" [FAILED]\n");
         perror("Cause");
         exit(1);
        }
      }
    printf(" [OK]");
  
    }while(fin == faux);  /* !feof(df) */     

// On attend la reponse concernant le motif //
printf("\n Attente de la recpetion concernant le motif ... ");
long_buf = MAX_BUF;
memset(buf,0,MAX_BUF);
recue = 
	recv(client, buf, long_buf, 0);
if(recue < 0)
  {
  printf(" [FAILED]");	  
  perror("Cause");
  }	  
  else
     {
      printf(" [OK]");
      printf("\n %s", buf); 
      printf(" \n Le transfert est termine avec succe.");
      printf(
  " \n Ouvrir le fichier client%d.log pour voir le resultat de la recpetion.\n"     , getpid());
     }


fclose(fd);
close(client);
printf("\n");
return 0;
}

//////////////////////////////////////////////////////////////////
//Procedure aui permet la creation d'une socket                 //
//et elle nou renvoi un descripteur sur le socket ainsi cree    //
//////////////////////////////////////////////////////////////////

int cree_socket()
{

  int client;
  
  // Creation du socket
  client = socket(AF_INET, SOCK_STREAM, 0);
  if(client < 0)
    {
      perror(" [FAILED] \n");
      return(-1);
    }
  printf(" [OK]\n"); 

  return client;
}

 Conclusion

Utilisation des sockets TCP pour transferer un fichier d'un poste vers un autre poste.
Il permet aussi de chercher une chaine particuliere dans ce fichier.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 juillet 2006 16:42:03 :
Quleques modifications au niveau des messages afficher
19 juillet 2006 21:46:30 :
J'ai regele un prob de conlict avec d'autre source
19 juillet 2006 21:47:19 :
j'ai ajouter le zip

 Sources du même auteur

Source avec Zip CHEMIN CRITIQUE PAR LA METHODE PERT
Source avec Zip TRANSFERT DE FICHIER VIA SOCKET UDP
SIMPLEX PRIMAL
Source avec Zip PROBLÈME DES 8 REINES GÉNÉRALISÉ
RECHERCHE DE MOTIF DANS UN TEXTE

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

 Sources en rapport avec celle ci

Source avec une capture DÉMINEUR SOUS TERMINAL par aom333
Source avec Zip CALLOCATOR par troctsch
Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip PARALLEL OBJECT PROGRAMMING IN C++ (POP-C++) : DEMO par lwinkler
PRODUCER CONSUMER C (WITHIN LINUX) par PCBill

Commentaires et avis

Commentaire de cosmobob le 14/07/2006 19:34:29

salut,
ta classe a la fin c'est du C#, quel est le rapport avec le debut qui est en C ? (mauvais copié-collé?)

Commentaire de Abdellah81 le 17/07/2006 21:13:21

Salut,
C'est pas du c# c'est du java, et il est ici par erreur lors des essays de transfert, je vais tenter de le réécrire, merci pour l'observation j'ai pas remarqué.

Commentaire de wxccxw le 19/07/2006 22:03:09

level : expert ?  je dirai initie tout au plus.

Commentaire de sophia_amoureuse le 24/07/2006 21:52:07

Je crois que tu exagere mr wxccxw, ce programme est de niveau expert, je crois que tu es encore jeune pour jugé ce genre de truques, j'ai vu vos programmes copie/colle concernant un editeur javascript barre de progression?????????????, je ne defend pas Abdellah81 mais c'est la vérité. Déolais wxccxw si je t'ai choque.

Commentaire de Abdellah81 le 08/08/2006 22:00:39

Salut
Maintenant le probleme est réglé. désolais

Commentaire de markarove le 19/09/2006 12:07:56

C'est un excelent programmae. Transfert de fichier via socket tcp et udp est un travail d'expert. Surtout votre programme de transfert udp, c'été un bon travail de simuler la technique de fiabilité du protocole tcp dans le protocole udp. Il y a un peut de bug, mais en générale c'est tres bien.

Commentaire de kerneltony95 le 08/10/2006 21:38:18

"level : expert ?  je dirai initie tout au plus"

garde tes réflexion pour toi wccxblablabla..

je trouve ce code trés intéressant même si il y a quelques bugs (ça se corrige)
je te met une bonne notes ^^

j'ai juste une question pour les gros fichiers style .avi .mpeg ou gros .exe
est que ton code les supportes et quelles est la taille max que l' on peut transférer?

sinon jolie travail !

Commentaire de Abdellah81 le 10/10/2006 13:42:37

Salut tt le monde Merci Kernelton95
Il n y a qucun probleme a transfere les grand fichier, puisque le transfert
ce fait par bloc de 2 ko.
Par consequent il n y a pas de taille limite.

Commentaire de kerneltony95 le 10/10/2006 14:54:39

d'accord merci, je voulais coder un code de ce type j'avais même prévu de coder
un protocole de communication ou un style de ftp, tu me facilite la tache :)

au niveau des librairies je peux compiler sous dev c++ ?

Commentaire de morientes104 le 30/10/2006 11:07:53

C'est un programme d'expert ça!!! Bravo Abdellah81.
J'essai de faire un programme transfert fichier en tcp avec deux interfaces client, serveur. Ils se connectent mais quand je veux ecrire des messages je n'arrive pas a les envoyer ou les recevoir. Comment faire???

Commentaire de kerneltony95 le 31/10/2006 01:54:15

abdel ???? au niveau des librairie il est fait pour un systeme linux/unix mais ça va vite a modif pour le balance sous windows je voulai te demander conseil sur les librairie que je dois mettre ? pour que sa marche sur des systeme xp 2000 ... ! ++
merci !

Commentaire de sylvunix le 01/02/2007 15:17:17

Bonjour,

Je viens de découvrir ce code ... que je trouve très intéressant. C'est un très bon exemple de la mise en oeuvre des sockets et des threads.

Pour information, il existe une fonction sendfile sous Linux (à partir de la version 2.2) qui permet le transfert de données entre un descripteur de fichier et un socket.

Commentaire de chou2bi le 25/06/2007 15:36:51

Il y a un bug ligne 196 : freopen("/historique","a+",hist); ouvre le fichier historique à la racine : Il faut enlever le slash!

Commentaire de Abdellah81 le 26/06/2007 22:09:35

Salut tout le monde
Ca fait long temp que j'ai abondoné ce domaine, mais je vaisrevirifié cette source. Merci pour vos remarques et suggestions.                              Abdellah

Commentaire de Sh4rk_40 le 02/02/2008 12:47:37

Bonjour. J ai juste un probleme que je n arrive pas a resoudre:
"Adresse ip du serveur est: 127.0.0.1
Demande de connexion au serveur ...  [FAILED]
Cause: Connection refused
"

Je ne comprend pas pourquoi c est refusé.

"
Construction de l'adresse du serveur ...  [OK]
Resolution du nom de serveur serveur ...  [FAILED]
Cause: Connection timed out
"

Aidez moi s'il vous plait

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

portage Linux vers visual C++ [ par acsx ] Salut,J'ai un programme écrit en C sous Linux et je souhaite le faire tourner sous Visual C++ 6.0 sous Windows.J'ai donc créé un projet win32 et intég Problème pour ouvrir une fenetre et écrire dedans sous Linux en C++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Problème pour ouvrir une fenetre sous linux en c++ [ par Nicolas ] Je souhaiterais savoir comment ouvrir une fenetre sous linux en C++(pour écrire dedans avec des "cout")MerciA+ Nicolas Linux et opengl [ par FleXus ] Helloje voudrais savoir comment utiliser et compiler un prog avec les fonctions d'opengl sous linux(j'utilise actuellement Kdevelop clone de visual c+ Récupérer une adresse IP. ( à partir de 2 cartes réseaux. ) [ par pcayrol ] Ma config : un PC avec deux cartes réseaux. Chaque carte a son adresse IP.Avec la fonction gethostbyname je recupere un pointeur HOSTENT qui pointe su processus sous linux [g++] [ par satanik_mike ] Bonjour,Je suis en train de d?velopper un serveur POP, SMTP en C++ sous linux, mais je bloque sur une petit probl?me d'ex?cution.J'ai fait un ex?cutbl Comment compiler avec GTK (sous linux) [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Comment compiler GTK (sous linux)??? [ par defcon ] Bonjour à touse, voilà, je voulais savoir comment compiler mon code source souis linux (avec librairie GTK)???Merci d'avance pour votre réponse.Amical Thread [ par Vince007 ] Bonjour, je vous laisse se message pour savoir si qqu'un qui connait bien les thread et les sémaphores sous Linux pourrait m'indiquer la méthode de co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales