Blog

socket en C (clients/serveur)

  : Ajouté le 27/6/2007 à 17:13

C'est une application qui fonctionne en mode client/serveur.
Ces derniers communiquent entre eux via des sockets
Le serveur fourni aux clients des informations stockées dans un fichier.
Les clients peuvent ensuite ajouter un nouvel employé ou en rechercher un dans ce fichier.
Pour la sécurité du serveur, un mot de passe a été défini pour que seul le client privilégié puissent deconnecter le serveur.

Mode de fonctionnement:

1- on lance le serveur
2- le serveur est ensuite a l'ecoute du client

3- on lance le(s) client(s)
4- un menu s'affiche
5-le client fait son choix:
 a- ajout d'un nouvel employé
 b- recherche d'un employé
 c- se deconnecter
 c- deconnecter le serveur s'il est identifié comme un super client


NB:le mot de passe pour déconnecter le serveur par le client privilégié  est: admin

 

/*xxxxxxxxxxxxxxxxxxxxx SERVEUR xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
int main (void)
{
  char _fichier[100]="$fichier";//le nom du fichier de stockage des informations
  int choixmenu;
  int deconnexion;
  int erreur1;
  int decoserv=0;//deconnexion du serveur
  int perefils;
  int f=0;
  int lgs;
  int  nump;   
  int socketprim;
  int socketsecond;
  int lg;//longueur struct
  int erreur; 
  FILE  *fich;
  typedef struct data {
 char nom[20];
 char poste[20];
 int age;
 int sal;
                  } data;
   data informations;
   data moi;   
  struct sockaddr_in adresse;
  socketprim=socket (PF_INET, SOCK_STREAM, 0);/* creation du descripteur de socket */
  if (socketprim == -1)
     {
  perror("echec de creation du socket sur le serveur");
     }
     else
       {
 lg=sizeof(struct sockaddr_in);

         adresse.sin_family=PF_INET;/* initialisation de l'adresse : le domaine */
  adresse.sin_port=9778;/* initialisation de l'adresse : le port */
  adresse.sin_addr.s_addr=INADDR_ANY;/* initialisation de l'adresse : la machine (locale) */
  erreur=bind(socketprim, (struct sockaddr *) &adresse, lg); /* liaison */

  if (erreur == -1)
            {
   perror("echec de liaison (par bind) du serveur");
     }
            else
               {
  erreur=listen(socketprim,10);  /* creation de la file d'attente */
          if (erreur == -1)
                    {
   perror("echec de creation de la file d'attente sur le serveur");
      }
                    else
         {
                        nump=getpid();
   //printf ("\n numero processus fork%d\n",nump);
   while(decoserv==0) {  //boucle infinie,le serveur accepte tous les clients et fait un classement
       socketsecond=accept(socketprim, (struct sockaddr *) &adresse, &lg); // attente du client
          if (erreur == -1)
             
       perror("echec de connexion");

       perefils = fork ();


/*xxxxxxxxxxxxxxx On est dans le fils xxxxxxxxxxxxxxxxxxxxxxxxxx*/
      if (perefils == 0)
 {
          deconnexion = 0;
   while (deconnexion == 0)
     {
                erreur = read (socketsecond, &choixmenu, sizeof (choixmenu));
  if(erreur==-1)
       perror("echec de lecture dans soketsecond");
  if((choixmenu==1)||(choixmenu==2)||(choixmenu==3)||(choixmenu==4))
       printf ("\nLe choix effectué par le client est ====>%d\n",choixmenu);
  else
                    {
       printf ("\nCe choix ne figure pas dans le menu !!\n");
      }
/*xxxxxxxxx Gestion du choix du client xxxxxxxxxxxxxxxxxxxxxxxx*/
       switch (choixmenu)
  {
  
  case 1:
    {
       printf ("\nAttente des informations transmises par le client!!\n");    
   fich=fopen(_fichier,"a+");
   if(fich==NULL)
      printf("impossible d'ouvrir le fichier de stockage : n° d'erreur= %d\n",errno);
      else
      {
          if(fich!=NULL)
      printf("\nOuverture du fichier de stockage employes avec succès!!\n");
      erreur=read (socketsecond, &informations, sizeof (informations));//reception
          if(erreur==-1)
       perror("echec de lecture dans soketsecond");
          if(erreur!=-1)
      printf("\nReception des informations avec succès!!\n");
      printf("Employé :%s \nPoste :%s\nAge :%d\nSalaire:%d\n",informations.nom,informations.poste,informations.age,informations.sal);
      erreur=fwrite(&informations,sizeof(informations),1,fich);//envoi
          if(erreur==-1)
       perror("echec d'ecriture dans le fichier de stockage");
   if(erreur!=-1)
      printf("\nEnregistrement des informations dans le fichier de stockage avec succès!!\n");
      sleep (5);
 printf("Employé :%s \nPoste :%s\nAge :%d\nSalaire:%d\n",informations.nom,informations.poste,informations.age,informations.sal);  
   erreur=fclose(fich);
   if ((int *)erreur==NULL)
                printf("\n Fermeture du fichier de stockage avec succès!!\n");
      }
      break;
    }
  case 2:
    {
                 printf ("\nAttente de la demande du client:\n");
   erreur = read (socketsecond, &moi.nom, sizeof (moi.nom)); //reception
   if(erreur==-1)
          perror("eche de lecture dans soketsecond");
   if (erreur!=-1)
   printf("\nReception des informations avec succès!!\n");
   printf ("\n le nom de l'employé recherché est: %s\n",moi.nom);
   fich=fopen(_fichier,"r");
   if(fich==NULL)
          printf("impossible d'ouvrir le fichier de stockage :n° d'erreur= %d\n",errno);
   if(fich!=NULL)
          printf("\nOuverture du fichier de stockage employé avec succès!!\n");
    do{
       f=f+1;
       erreur=fread(&informations, sizeof(informations), 1, fich);
         if (erreur==-1)
                                               printf("\nExtraction des données stockées echouées!!\n");
         if (strcmp(informations.nom,moi.nom)==0)
                {
                          printf("Employé :%s \nPoste :%s\nAge :%d\nSalaire:%d\n",informations.nom,informations.poste,informations.age,informations.sal);  
                                               erreur=write(socketsecond, &informations,sizeof(informations));
                          if(erreur==-1)
                                 perror("echec d'ecriture dans socketsecond");
            if (erreur!=-1)
                          printf("\n Transmission des informations avec succès!!\n");
                                              printf("Employé :%s \nPoste :%s\nAge :%d\nSalaire:%d\n",informations.nom,informations.poste,informations.age,informations.sal);
 printf("\nLa position de l'employé recherché est =%d\n \n",f);    
                                               lgs=sizeof(informations);
                                               printf("\nLongueur de la socket transmise est :%d\n",lgs);
            break;
         }
     if (strcmp(informations.nom,moi.nom)!=0&&(feof(fich)))
      {
      strcpy(informations.nom,"n'existe pas");
      strcpy(informations.poste,"vide");
      informations.age=0;
      informations.sal=0;
      erreur=write(socketsecond, &informations,sizeof(informations));
      if (erreur!=-1)
                           printf("\nCet employé n'existe pas (information transmise avec succés) !!\n");
      if(erreur==-1)
                                  perror("echec d'ecriture dans socketsecond");
           }
      }while(!feof(fich));       
                    erreur=fclose(fich);
      if ((int *)erreur==NULL)
      printf("\nFermeture du fichier de stockage avec succès!!\n");
      else
      printf("\nimpossible de fermer le fichier de stockage !!\n");
      break; 
    }
  case 3:
    {
      printf ("\nDemande de Déconnexion!!\n");
      deconnexion = 1;       
      break;
    }
  case 4:
    {
      printf ("\nDemande de fermeture du serveur,attente de mot de passe client!!\n");
      erreur = read (socketsecond, &informations.nom, sizeof (informations.nom)); //reception
   if(erreur==-1)
          perror("lecture dans la soketsecond");
   if (erreur!=-1)
   printf("\nReception des informations avec succès!!\n");
   printf ("\nLe mot de passe que vous avez tapez est : %s\n",informations.nom);
   printf ("\nIDENTIFICATION!\n");
      if (strcmp(informations.nom,"admin")==0)
   {
           strcpy(informations.nom,"ok");
    deconnexion = 2;
    erreur=write(socketsecond, &informations.nom,sizeof(informations.nom));
              if(erreur==-1)
                 perror("ecriture dans la socketsecond");
   } 
      else
   {
    strcpy(informations.nom,"no");
                         erreur=write(socketsecond, &informations.nom,sizeof(informations.nom));
              if(erreur==-1)
                 perror("ecriture dans  socketsecond");
                            if (erreur!=-1)
          printf("\n DEMANDE DE FERMETURE REFUSE!!\n");
           }          
              break;
                        
    }

  default:
    {
      printf ("\nSaisissez une instruction svp!!\n");
      break;
    }
  
      }//fin switch (choixmenu)
                if (deconnexion==1)
    { 
      printf ("\nDemande de Deconnexion Accepter , BYE!!\n");
             erreur = close (socketsecond);
      if (erreur!=-1)
             printf("\nfermeture du socket client avec succès!!\n");
      else
       printf("\nimpossible de fermer le socket client !!\n");
    } 
                if (deconnexion==2)
    {
      sleep(1); 
      printf ("\nDemande de fermeture du serveur Accepté , COOL!!\n");
      erreur = close (socketsecond);
             erreur1 = close (socketprim);
      decoserv = 1;
      if (erreur!=-1)
             printf("\nSocket client fermé avec succès!!\n");
      else
      printf("\nimpossible de fermer le socket client !!\n");
      if (erreur1!=-1)
             {
   printf("\nSocket serveur fermé avec succès :cool!!\n");
       nump=getppid();
   char tab12[20]="kill ";
   char tab11[20]="";
   sprintf(tab11,"%d",nump);
   strcat(tab12,tab11);
   system(tab12);
   //printf("\nBY\n");
      }
      else
     printf("\nimpossible de fermer le socket client !!\n");
   
    }
          }
        }
      }
     }
   }
 }
  return 0;
}


/*xxxxxxxxxxxxxxxxxxxxxxxxxx client xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */

#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
int
main (void)
{
  int socketprim;
  int taille;
  int longueurstruct;
  int connectionserveur;
  int arretserveur;
  int choixmenu;
  int erreur;
  int lgs;
  typedef struct data {
 char nom[20];
 char poste[20];
 int age;
 int sal;
  } data;
  data informations1;
  data cher; 
  struct sockaddr_in adresse;

/* creation du descripteur de socket */
  longueurstruct = sizeof (struct sockaddr_in);
  adresse.sin_family = PF_INET; /* initialisation de l'adresse : le domaine */
  adresse.sin_port = 9778; /* initialisation de l'adresse : le port */
  adresse.sin_addr.s_addr =INADDR_ANY; /* initialisation de l'adresse : la machine (locale) */
 
  socketprim = socket (PF_INET, SOCK_STREAM, 0);
  if (socketprim == -1)
    perror("echec de creation du socket sur le serveur");

 

/* connexion au serveur */
  connectionserveur = connect (socketprim, (struct sockaddr *) &adresse, longueurstruct);
  if (connectionserveur == -1)
    perror ("liaison (par connect) du client");
  else{
  arretserveur = 0;
  if(arretserveur ==0)
  printf("\nHello!!\nServeur détécté veuillez faire votre choix!!:\n");
  while (arretserveur == 0)
    {

 

/*affichage du menu*/
printf("\n\n\n\t ------------------------MENU--------------------\n\t|1°)   ENREGISTRER UN EMPLOYE                    |\n\t|2°)   RECHERCHER UN EMPLOYE                     |\n \t|3°)   DECONNECTION DU CLIENT                    |\n \t|4°)   FERMER SERVEUR                            |\n\t ------------------------------------------------ \n \t");
      erreur = scanf ("%d", &choixmenu);
      erreur = write (socketprim, (int *) &choixmenu, sizeof (choixmenu));
                 if (erreur==-1)
                 printf("\nErreur d'ecriture dans  socketprim!\n");  
       if (choixmenu == 1)
 {
   printf("Veuillez saisir un nom d'employé : ");
    scanf("%s",informations1.nom);
    printf("Veuillez le poste de l'employé: ");
    scanf("%s",&informations1.poste);
    printf("Veuillez saisir l'age de l'employé: ");
    scanf("%d",&informations1.age);
    printf("Veuillez saisir le salaire de l'employé : ");
    scanf("%d",&informations1.sal);
  erreur= write (socketprim, &informations1, sizeof (informations1));//envoi
                if(erreur!=-1)
                        printf("\nInformation transmise au serveur avec succès!:super cool \n");
  else
          printf("\nErreur d'ecriture dans socketprim!\n");    
 }
       else if (choixmenu == 2)
 {
         printf("Veuillez saisir le nom de l'employé recherché ? : ");
  scanf("%s",cher.nom);  
  write (socketprim, &cher.nom, sizeof (cher.nom));//envoi
     if (erreur==-1)
        printf("\nErreur d'ecriture dans la socketprim!\n");    
     else
               printf("\nInformation transmise au serveur avec succès!\n");
               sleep(1);
   erreur=read(socketprim,&informations1,sizeof(informations1));
                 taille=sizeof(informations1);
                 if (erreur==-1)
               printf("\nErreur de lecture dans  socketprim!\n");   
   else if(erreur!=-1&&taille!=0)
                    {
                      if (strcmp(informations1.nom,"n'existe pas")!=0)
   {
        printf("\nLa socket est receptionnée et ouverte avec succès!\n");
                      lgs=sizeof(informations1);
                      printf("\nLa Longueur du socket reçue par le client est: %d\n",lgs);
                      printf ("\nVoici les informations concernant l'employé : %s\n",cher.nom );
                      printf("Employé :%s \nPoste :%s\nAge :%d\nSalaire:%d\n",informations1.nom,informations1.poste,informations1.age,informations1.sal);
   }
                      else
                      printf("\nCET EMPLOYE N'EXISTE PAS FAITES UN AUTRE CHOIX SVP!!\n"); 
      }
                       
 }
      else if (choixmenu == 3)
       {
 sleep(1.01);
 printf("\nMERCI,BYE!\n");
 arretserveur = 1;
        erreur = close (socketprim);
      if(erreur!=-1)
                printf("\nSOCKET CLIENT FERMEE AVEC SUCCES !\n");
      else
    printf("\nSocket client fermeture impossible!\n");
  
       }
 else if (choixmenu == 4)
       {
 printf("\n veuillez saisir votre mot de passe svp:\n");
 scanf("%s",informations1.nom);
 erreur= write (socketprim, &informations1.nom, sizeof (informations1.nom));//envoi
      if(erreur==-1)
          printf("\nErreur d'ecriture dans la socketprim!\n");
                     else
                           printf("\nInformations transmises au serveur avec succès!\n");
                    erreur=read(socketprim,&informations1.nom,sizeof(informations1.nom));
                           taille=sizeof(informations1);
                            if (erreur==-1)
                         printf("\nErreur de l'ecture dans la socketprim!\n");   
                  else if(erreur!=-1&&taille!=0)
                                {
                                   if (strcmp(informations1.nom,"ok")==0)
                              {
                              sleep(2);
                       printf("\nMERCI!\n");
                       arretserveur = 1;
                              erreur = close (socketprim);
                       if(erreur!=-1)
                              printf("\nClient et Serveur fermés avec succès!\n");
                          break;
         }
                      else if (strcmp(informations1.nom,"no")==0)
                                printf("\nVOUS N'ETES PAS UN CLIENT PRIVILIGE VOTRE DEMANDE EST REFUSEE!!!\n");         
                                 }       
     }

   }
 }
  return 0;
}

» Catégorie Apache&linux
Poster un commentaire

<- Précedent :: Suivant ->

A propos du blogueur

papisco est un blog consacré à l'informatique plus précisement à la programation , securite informatique ,sur les decouvertes scientifiques,n'hesiter de proposer vos idées...

Liens

Accueil
Voir mon profile
Archives
Email
Blog RSS

Catégories

Apache&linux
base de données
divers
obama
open souce
php/mysql
réseaux
Sécurité informatique
stage
web2.0

Amis

0

Liens

Forum des Techniciens Spécialisés en Développement Informatique
informatique
hebergement ,web solution...
secureman
B2

Services


Sondage

Partenaires : Fonds d'écran gratuits | Katie Melua




0.02 | 9