IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Sémaphores et mémoire partagée (interaction client - serveur)


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 19
    Par défaut Sémaphores et mémoire partagée (interaction client - serveur)
    Bonjour à tous,


    Pour un exercice, je dois transférer une chaine de caractères d'un client vers un serveur, ce dernier transforme les minuscules en majuscule et la renvoie au client, tout ça en utilisant des sémaphores et une mémoire partagée.


    A mon avis, ce qui coince, c'est que je n'utilise pas les sémaphores au bon moment. Les fonctions down, up et initialize sont correctes car je les ai déjà utilisées dans un exercice précédent.

    Si vous pouviez jeter un coup d'oeil, ce serait sympa.

    Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    # include <stdio.h>
    # include <stdlib.h>
    # include <unistd.h>
    # include <sys/wait.h>
    # include <sys/types.h>
    # include <signal.h>
    # include <sys/time.h>
    # include <sys/sem.h>
    # include <sys/types.h>
    # include <sys/ipc.h>
    # include <semaphore.h>
    # include <sys/shm.h>
     
    int down(int sem_id, int sem_num)
    {
    	struct sembuf sem_op;
    	sem_op.sem_num=sem_num;
    	sem_op.sem_op=-1;
    	sem_op.sem_flg=0;
     
    	if(semop(sem_id, &sem_op, 1) == -1) return -1;
    	else return 0;
    }
     
    int up(int sem_id, int sem_num)
    {
    	struct sembuf sem_op;
    	sem_op.sem_num=sem_num;
    	sem_op.sem_op=+1;
    	sem_op.sem_flg=0;
     
    	if(semop(sem_id, &sem_op,1) == -1) return -1;
    }
     
    int main (){
    	int i=0, semid, shmid;
    	char *string;	
     
     
    	semid=semget(1234,1,IPC_CREAT|0660);
    	if(semid==-1)
    	{
    		perror("Erreur lors du semget");
    		exit(-1);
    	}
     
    	shmid=shmget(13245,80*sizeof(char),IPC_CREAT|0660);	// Creation de la memoire partagee
     
    	if(shmid==-1)
    	{
    		perror("Erreur lors du shmget");
    		exit(-1);
    	}	
     
    	string=(char*)shmat(shmid,NULL,SHM_W|SHM_R);	// Attachement de la memoire partagee dans le pointeur memoire
     
    	down(semid,0);		
    	scanf("%s", string);			
    	printf("%s \n", string);
    	up(semid,0);
     
     
     
     
     
    	return 0 ;
     
    }
    Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    # include <stdio.h>
    # include <stdlib.h>
    # include <unistd.h>
    # include <sys/wait.h>
    # include <sys/types.h>
    # include <signal.h>
    # include <sys/time.h>
    # include <sys/sem.h>
    # include <sys/types.h>
    # include <sys/ipc.h>
    # include <semaphore.h>
    # include <sys/shm.h>
     
     
    union semun {
                 int val; 
                 struct semid_ds *buf;
                 unsigned short *array;
                 struct seminfo *__buf;
    };
     
    int initialize(int sem_id, int sem_num, int init)
    {
    	union semun semunion;
    	semunion.val=init;
    	if(semctl(sem_id,sem_num,SETVAL,semunion) == -1) return -1;
    	else return 0;	
    }
     
    int down(int sem_id, int sem_num)
    {
    	struct sembuf sem_op;
    	sem_op.sem_num=sem_num;
    	sem_op.sem_op=-1;
    	sem_op.sem_flg=0;
     
    	if(semop(sem_id, &sem_op, 1) == -1) return -1;
    	else return 0;
    }
     
    int up(int sem_id, int sem_num)
    {
    	struct sembuf sem_op;
    	sem_op.sem_num=sem_num;
    	sem_op.sem_op=+1;
    	sem_op.sem_flg=0;
     
    	if(semop(sem_id, &sem_op,1) == -1) return -1;
    }
     
    int main (){
    	int i=0, semid, shmid;			
    	char *string;
     
     
    	semid=semget(1234,1,IPC_CREAT|0660);		// Creation d'un groupe contenant 2 semaphore	
     
    	if(semid==-1)
    	{
    		perror("Erreur lors du semget");
    		exit(-1);
    	}		
     
    	initialize(semid,1,0);	
     
     
    	shmid=shmget(13245,80*sizeof(char),IPC_CREAT | 0660);	// Creation de la memoire partagee
     
    	if(shmid==-1)
    	{
    		perror("Erreur lors du shmget");
    		exit(-1);
    	}
     
    	string=(char*)shmat(shmid,NULL,SHM_W|SHM_R);	// Attachement de la memoire partagee dans le pointeur memoire
     
     
     
     
    	while(1){
     
    		printf("serveur %s \n", string); // 2 lignes de test
    		sleep(3);
                    //down(semid,0);     // Vrai code
    		/*for (i=0; i<sizeof(string); i++)
    			string[i]=toupper(string[i]);
    		for (i=0; i<sizeof(string); i++)
    			printf("%c", string[i]);	
    		printf("\n");
    		//up(semid,0);	*/
    		}
     
     
     
     
    	shmdt(string);		// Detachement de la memoire partagee	
    	shmctl(shmid,IPC_RMID,NULL);	// Suppression de la memoire partagee
    	semctl(semid,0,IPC_RMID,NULL);	// Suppression du groupe de semaphores
     
    	return 0 ;
     
    }
    Comme vous l'avez remarqué, je ne me suis pas encore soucié du retour du message. Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Soucies toi en premier lieu du retour de tes fonctions, cela renvoie peut être -1 et dans ce cas regardes l'erreur dans errno.

  3. #3
    Membre averti
    Inscrit en
    Août 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 19
    Par défaut
    Tu veux parler pour shmat ? Le reste ne renvoie pas d'erreur.

    Pour le client,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	down(semid,0);		
    	scanf("%s", string);			
    	printf("%s \n", string);
    	up(semid,0);
    La seule chance pour que ça marche, c'est de mettre down et up en commentaire. Si j'en laisse un des deux voir les deux, on dirait que le programme attend quelque chose, le printf ne marche pas juste après la saisie du scanf (qui je pense, ne marche pas non plus).

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Je parlais du retour de tes fonctions down et up et donc de semop().

    Aussi tu as un souci avec l'utilisation de scanf, c'est l'adresse que tu dois lui passer => &string

  5. #5
    Membre averti
    Inscrit en
    Août 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 19
    Par défaut
    J'avance j'avance

    Mes sémaphores sont ok, les processus affichent bien leur message à tour de rôle au bon moment.

    Par contre, le serveur ne reçoit pas la modification du client et vice versa.

    Voilà le code travaillé (uniquement la partie modifiée) :

    Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	string=(char*)shmat(shmid,NULL,SHM_W|SHM_R);	// Attachement de la memoire partagee dans le pointeur memoire
     
    	printf("%d\n", __LINE__);
    	down(semid,0);
    	printf("%d\n", __LINE__);		
    	scanf("%s", &string);
    	printf("%d\n", __LINE__);			
    	printf("%s \n", &string);
    	printf("%d\n", __LINE__);
    	up(semid,0);
    	down(semid,0);
    	printf("%s \n", &string);
    	up(semid,0);
    Serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    string=(char*)shmat(shmid,NULL,SHM_W|SHM_R);	// Attachement de la memoire partagee dans le pointeur memoire
     
     
    	sleep(5);	
    	down(semid,0);		
    	printf("serveur %s \n", &string);
    	for (i=0; i<sizeof(string); i++)
    		string[i]=toupper(string[i]);
    	for (i=0; i<sizeof(string); i++)
    		printf("%c", string[i]);	
    	printf("\n");
    	up(semid,0);	
    	down(semid,0);
    	up(semid,0);
    Donc, si j'entre "test" au client, il va bien afficher test au printf.
    Le serveur quand à lui, affichera "serveur "
    Et quand ça sera de nouveau au tour du client, il réaffichera "test"

    La mémoire n'est pas partagée en fait. Est-ce que je dois attacher la mémoire de mon serveur après le down(semid, 0) ?


    Merci de ton aide

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Regardes le contenu de la variable errno après le shmat pour vérifier qu'il a bien réussi à attacher la mémoire.

    S’il réussit, shmat() renvoie l’adresse d’attachement du segment de mémoire partagée. En cas d’échec (void *) −1 est renvoyé, et errno contient le code d’erreur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DDE] Interactions client-serveur
    Par TheGzD dans le forum Visual C++
    Réponses: 0
    Dernier message: 15/01/2009, 13h52
  2. Hibernate, Cache partagé, application Client-Serveur
    Par DjGonk dans le forum Hibernate
    Réponses: 5
    Dernier message: 25/06/2008, 12h11
  3. Création sémaphore et mémoire partagée python
    Par geek44 dans le forum Général Python
    Réponses: 2
    Dernier message: 10/05/2008, 03h00
  4. Mini Chat - sémaphores et mémoire partagée
    Par highman dans le forum Réseau
    Réponses: 4
    Dernier message: 02/04/2007, 21h54
  5. Sémaphores et Mémoires partagées
    Par Sensib dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2006, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo