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 (" numero processus fork%d ",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 (" Le choix effectué par le client est ====>%d ",choixmenu);
  else
                    {
       printf (" Ce choix ne figure pas dans le menu !! ");
      }
/*xxxxxxxxx Gestion du choix du client xxxxxxxxxxxxxxxxxxxxxxxx*/
       switch (choixmenu)
  {
  
  case 1:
    {
       printf (" Attente des informations transmises par le client!! ");    
   fich=fopen(_fichier,"a+");
   if(fich==NULL)
      printf("impossible d'ouvrir le fichier de stockage : n° d'erreur= %d ",errno);
      else
      {
          if(fich!=NULL)
      printf(" Ouverture du fichier de stockage employes avec succès!! ");
      erreur=read (socketsecond, &informations, sizeof (informations));//reception
          if(erreur==-1)
       perror("echec de lecture dans soketsecond");
          if(erreur!=-1)
      printf(" Reception des informations avec succès!! ");
      printf("Employé :%s Poste :%s Age :%d Salaire:%d ",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(" Enregistrement des informations dans le fichier de stockage avec succès!! ");
      sleep (5);
 printf("Employé :%s Poste :%s Age :%d Salaire:%d ",informations.nom,informations.poste,informations.age,informations.sal);  
   erreur=fclose(fich);
   if ((int *)erreur==NULL)
                printf(" Fermeture du fichier de stockage avec succès!! ");
      }
      break;
    }
  case 2:
    {
                 printf (" Attente de la demande du client: ");
   erreur = read (socketsecond, &moi.nom, sizeof (moi.nom)); //reception
   if(erreur==-1)
          perror("eche de lecture dans soketsecond");
   if (erreur!=-1)
   printf(" Reception des informations avec succès!! ");
   printf (" le nom de l'employé recherché est: %s ",moi.nom);
   fich=fopen(_fichier,"r");
   if(fich==NULL)
          printf("impossible d'ouvrir le fichier de stockage :n° d'erreur= %d ",errno);
   if(fich!=NULL)
          printf(" Ouverture du fichier de stockage employé avec succès!! ");
    do{
       f=f+1;
       erreur=fread(&informations, sizeof(informations), 1, fich);
         if (erreur==-1)
                                               printf(" Extraction des données stockées echouées!! ");
         if (strcmp(informations.nom,moi.nom)==0)
                {
                          printf("Employé :%s Poste :%s Age :%d Salaire:%d ",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(" Transmission des informations avec succès!! ");
                                              printf("Employé :%s Poste :%s Age :%d Salaire:%d ",informations.nom,informations.poste,informations.age,informations.sal);
 printf(" La position de l'employé recherché est =%d ",f);    
                                               lgs=sizeof(informations);
                                               printf(" Longueur de la socket transmise est :%d ",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(" Cet employé n'existe pas (information transmise avec succés) !! ");
      if(erreur==-1)
                                  perror("echec d'ecriture dans socketsecond");
           }
      }while(!feof(fich));       
                    erreur=fclose(fich);
      if ((int *)erreur==NULL)
      printf(" Fermeture du fichier de stockage avec succès!! ");
      else
      printf(" impossible de fermer le fichier de stockage !! ");
      break; 
    }
  case 3:
    {
      printf (" Demande de Déconnexion!! ");
      deconnexion = 1;       
      break;
    }
  case 4:
    {
      printf (" Demande de fermeture du serveur,attente de mot de passe client!! ");
      erreur = read (socketsecond, &informations.nom, sizeof (informations.nom)); //reception
   if(erreur==-1)
          perror("lecture dans la soketsecond");
   if (erreur!=-1)
   printf(" Reception des informations avec succès!! ");
   printf (" Le mot de passe que vous avez tapez est : %s ",informations.nom);
   printf (" IDENTIFICATION! ");
      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(" DEMANDE DE FERMETURE REFUSE!! ");
           }          
              break;
                        
    }

  default:
    {
      printf (" Saisissez une instruction svp!! ");
      break;
    }
  
      }//fin switch (choixmenu)
                if (deconnexion==1)
    { 
      printf (" Demande de Deconnexion Accepter , BYE!! ");
             erreur = close (socketsecond);
      if (erreur!=-1)
             printf(" fermeture du socket client avec succès!! ");
      else
       printf(" impossible de fermer le socket client !! ");
    } 
                if (deconnexion==2)
    {
      sleep(1); 
      printf (" Demande de fermeture du serveur Accepté , COOL!! ");
      erreur = close (socketsecond);
             erreur1 = close (socketprim);
      decoserv = 1;
      if (erreur!=-1)
             printf(" Socket client fermé avec succès!! ");
      else
      printf(" impossible de fermer le socket client !! ");
      if (erreur1!=-1)
             {
   printf(" Socket serveur fermé avec succès :cool!! ");
       nump=getppid();
   char tab12[20]="kill ";
   char tab11[20]="";
   sprintf(tab11,"%d",nump);
   strcat(tab12,tab11);
   system(tab12);
   //printf(" BY ");
      }
      else
     printf(" impossible de fermer le socket client !! ");
   
    }
          }
        }
      }
     }
   }
 }
  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(" Hello!! Serveur détécté veuillez faire votre choix!!: ");
  while (arretserveur == 0)
    {

 

/*affichage du menu*/
printf(" ------------------------MENU-------------------- |1°)   ENREGISTRER UN EMPLOYE                    | |2°)   RECHERCHER UN EMPLOYE                     | |3°)   DECONNECTION DU CLIENT                    | |4°)   FERMER SERVEUR                            | ------------------------------------------------ ");
      erreur = scanf ("%d", &choixmenu);
      erreur = write (socketprim, (int *) &choixmenu, sizeof (choixmenu));
                 if (erreur==-1)
                 printf(" Erreur d'ecriture dans  socketprim! ");  
       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(" Information transmise au serveur avec succès!:super cool ");
  else
          printf(" Erreur d'ecriture dans socketprim! ");    
 }
       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(" Erreur d'ecriture dans la socketprim! ");    
     else
               printf(" Information transmise au serveur avec succès! ");
               sleep(1);
   erreur=read(socketprim,&informations1,sizeof(informations1));
                 taille=sizeof(informations1);
                 if (erreur==-1)
               printf(" Erreur de lecture dans  socketprim! ");   
   else if(erreur!=-1&&taille!=0)
                    {
                      if (strcmp(informations1.nom,"n'existe pas")!=0)
   {
        printf(" La socket est receptionnée et ouverte avec succès! ");
                      lgs=sizeof(informations1);
                      printf(" La Longueur du socket reçue par le client est: %d ",lgs);
                      printf (" Voici les informations concernant l'employé : %s ",cher.nom );
                      printf("Employé :%s Poste :%s Age :%d Salaire:%d ",informations1.nom,informations1.poste,informations1.age,informations1.sal);
   }
                      else
                      printf(" CET EMPLOYE N'EXISTE PAS FAITES UN AUTRE CHOIX SVP!! "); 
      }
                       
 }
      else if (choixmenu == 3)
       {
 sleep(1.01);
 printf(" MERCI,BYE! ");
 arretserveur = 1;
        erreur = close (socketprim);
      if(erreur!=-1)
                printf(" SOCKET CLIENT FERMEE AVEC SUCCES ! ");
      else
    printf(" Socket client fermeture impossible! ");
  
       }
 else if (choixmenu == 4)
       {
 printf(" veuillez saisir votre mot de passe svp: ");
 scanf("%s",informations1.nom);
 erreur= write (socketprim, &informations1.nom, sizeof (informations1.nom));//envoi
      if(erreur==-1)
          printf(" Erreur d'ecriture dans la socketprim! ");
                     else
                           printf(" Informations transmises au serveur avec succès! ");
                    erreur=read(socketprim,&informations1.nom,sizeof(informations1.nom));
                           taille=sizeof(informations1);
                            if (erreur==-1)
                         printf(" Erreur de l'ecture dans la socketprim! ");   
                  else if(erreur!=-1&&taille!=0)
                                {
                                   if (strcmp(informations1.nom,"ok")==0)
                              {
                              sleep(2);
                       printf(" MERCI! ");
                       arretserveur = 1;
                              erreur = close (socketprim);
                       if(erreur!=-1)
                              printf(" Client et Serveur fermés avec succès! ");
                          break;
         }
                      else if (strcmp(informations1.nom,"no")==0)
                                printf(" VOUS N'ETES PAS UN CLIENT PRIVILIGE VOTRE DEMANDE EST REFUSEE!!! ");         
                                 }       
     }

   }
 }
  return 0;
}

Tags :



» Catégorie Apache&linux
Commentaires (0) :: Poster un commentaire :: Lien permanent :: Envoyer à un ami

QCM– Linux Sécurité externe

  : Ajouté le 27/6/2007 à 10:28

 Linux Sécurité externe

66) tcpdump est un outil de

a) Capture de trames

b) Filtrage de trame

c) Configuration réseau

d) surveillance réseau

 

67) Pour aficher tous les paquets sans les tronquer en format hexadecimal et ASCII:

a) tcpdump -X –s0

b) tcpdump -x –s0

c) tcpdump -XX –s0

d) tcpdump -XX –s0 icmp

 

68) Lequel de ces protocoles n’est pas un protocole utilisé pour créer un VPN:

a) IPSec

b) L2PP

c) L2TP

d) PPTP

 

69) Un VLAN est un réseau

a) Local regroupant un ensemble de machines de façon logique

b) Etendu regroupant un ensemble de machines de façon logique

c) Local regroupant des réseaux physiques distincts

d) Local regroupant des utilisateurs virtuels

 

70) nmap est un outil qui ne permet pas de

a) Scanner des ports TCP

b) Scanner des ports UDP

c) Scanner des ports IP

d) Scanner des machines qui nÂ’autorisent pas les echo request

 

71) netstat est un outil qui permet de connaitre les ports en ecoute

a) Des serveurs

b) Des clients

c) Des serveurs et des clients

d) Du protocole IP

 

72) Le port forwarding dans ssh est une

a) Technique pour cacher des ports

b) Technique pour sécuriser des services

c) Technique pour changer le port par défaut ssh

d) Technique pour translater des adresses IP en utilisant des ports

 

73) La commande ssh –L 3000:serveur_ftp:21 serveur_ssh permet une connexion ftp securisée à partir de la machine

170.13.14.5 en utilisant?

a) ftp 127.0.0.1 3000

b) ftp 170.13.14.5 3000

c) Les deux propositions précédentes

d) Aucune des propositions précédentes

 

74) tcpdump filtre lÂ’affichage des paquets udp en fonction du

a) Numéro de séquence

b) Numéro d’acquitement

c) Bit de syn

d) Service utilisé

 

75) Le login et mot de passe telnet sont capturés en clair dans

a) Un seul paquet

b) Deux paquets

c) Trois paquets

d) En fonction de la taille du login et mot de passe

 

76) La réponse à une demande de connexion est un segment dont les bits positionnés sont ?

a) ACK

b) SYN

c) PSH

d) SYN et ACK

 

77) Le champ code dans le paquet icmp donne

a) LÂ’information sur le type du paquet icmp

b) L’information détaillée sur type de commande

c) L’information détaillée sur type d’erreur

d) Aucunne des réponses précédentes

 

78) Un paquet TCP contenant le flag PUSH permet de :

a) Détruire une connexion TCP en urgence.

b) Initier une fin de connexion.

c) Forcer la couche transport à livrer les données à la couche applicative.

d) Signifier à la couche transport de traiter le paquet en priorité.

 

79) ethereal ne permet pas de

a) capturer des trames

b) reconstituer une session

c) construire et envoyer un paquet

d) générer des graphes de statistique

Tags :



» Catégorie Apache&linux
Commentaires (0) :: Poster un commentaire :: Lien permanent :: Envoyer à un ami

QCM-Interconnex. /Linux-Win (Samba, NFS)

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

Interconnex. /Linux-Win (Samba, NFS)

 

51) Lancer Samba consiste à lancer les démons :

a) sambad, nmbd.

b) smbd, nmbd.

c) smbd, network.

d) nmbd, network.

 

52) La commande : $ /sbin/chkconfig --list smb

a) Liste le fichier de configuration de samba smb.conf.

b) Affiche l'état du processus smbd.

c) Affiche le mode de démarrage de samba pour chaque runlevel.

d) Liste tous les démons lancés avec smbd.

 

53) Pour tester le fichier de configuration de SAMBA, on utilisera la commande

a) testparm.

b) testsmb.

c) smbtest.

d) parmtest.

 

54) Pour qu'un utilisateur windows puisse accéder à un partage SAMBA, avec l'option security par défaut, il doit :

a) Avoir les droits sur le partage.

b) Avoir une entrée dans le fichier smbpasswd.

c) Avoir un mot de passe windows.

d) Avoir une entrée dans le fichier /etc/shadow.

 

55) Les démons de SAMBA peuvent être lancés via le superdémon xinetd (ou inetd) ?

a) Oui.

b) Non.

c) Cela dépend de la version de Samba.

d) Oui pour smbd, mais non pour nmbd

 

56) Pour configurer SAMBA en PDC, on doit obligatoirement configurer dans le fichier smb.conf, l'option :

a) security = share.

b) domain master = yes.

c) domain logons = yes.

d) domain name = <nom_domaine>

 

57) Pour lancer le service nfs, on doit lancer les démons :

a) nfsd et portmap.

b) nfsd et rpcd.

c) nfsd et xinetd

d) nfsd et inetd.

 

58) Pour que la machine "host1" exporte son répertoire /home en mode lecture/ecriture à toutes les machines du sousréseau

192.168.10.64, on doit :

a) insérer dans /etc/exports la ligne : /home 192.168.10.64/255.255.255.192(rw)

b) insérer dans /etc/inittab la ligne : /home 192.168.10.64/255.255.255.0(rw)

c) insérer dans /etc/exports la ligne : /home 192.168.10.64(rw)

d) insérer dans /etc/nfstab : /home 192.168.10.64(rw)

 

59) Dans le fichier smb.conf, si l'option "security = share", cela :

a) Ne nécessite la création d'aucun utilisateur Samba.

b) Nécessite la création d'un utilisateur sans obligation de le rajouter à smbpasswd.

c) L'accès au partage Samba à partir de machines windows se fait via une authentification windows.

d) Valeur non valide pour cette option.

 

60) Pour monter un partage windows sur une machine Linux, on utilisera la commande :

a) # smbmount //host_win/ ressource /mnt/montage

b) # smbclient \nom_serveur_smb essource -U nom_user

c) # smbmount ////host_win//ressource /mnt/montage -o guest

d) # smbmount //host_win/ressource /mnt/montage -o guest

 

61) Pour connaître l'adresse IP du host windows "station", on exécute la commande :

a) $ nmblookup station

b) $ smblookup station

c) $ nslookup station

d) $ findlookup station

 

62) On définit un partage Samba "Partage1" avec l'option "writable=yes".

Soit "smbuser" un utilisateur Samba se connectant à partir d'une machine windows. Pourrait-il créer des dossiers dans le partage

"Partage1", sachant que :

$ ll partage1

drwxr-xr-x 3 root root 4096 jun 6 15:30 partage/

a) Non, il n'est le propriétaire du partage.

b) Oui, le partage est writable.

c) Tout dépend de ses droits sous windows.

d) Aucune de ces réponses.

 

63) Il est possible d'accéder à un partage Samba avec un login windows sans être declaré dans smbpasswd, en utilisant

les options suivantes :

a) Activer dans smb.conf username map = /etc/samba/smbusers.

b) Insérer une correspondance entre le login windows et un compte samba dans smbusers.

c) (a) et (b).

d) Ce n'est pas possible sans passer par le smbpasswd.

 

64) Pour monter la partie /home du système de fichier exporté par la machine "host1", sur la station "host2" au point de

montage /mnt/nfsfs, on exécutera la commande :

a) mount -t nfs /home /mnt/nfsfs

b) mount -t nfs /mnt/nfsfs /home

c) mountnfs host1:/home /mnt/nfsfs

d) mount -t nfs host1:/home /mnt/nfsfs

 

65) L'option : logon path = \%LProfiles\%u, permet de spécifier que :

a) Les profils errants sont stockés sur le poste local dans un dossier portant le nom de l'utilisateur connecté.

b) %L est le nom netbios du serveur Samba et %u est le nom de l'utilisateur connecté.

c) %L est le path indiqué dans la section [Profiles] et %u le nom de l'utilisateur connecté.

d) %L est le path indiqué dans la section [netlogon] et %u le nom de l'utilisateur connecté.

Tags :



» Catégorie Apache&linux
Commentaires (0) :: Poster un commentaire :: Lien permanent :: Envoyer à un ami
<< Précedent :: Suivant | | >>
Créer un blog | Liens : Fonds d'écran gratuits | Katie Melua |  Contacter l'auteur