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 :

Les signaux (en C)


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Par défaut Les signaux (en C)
    Bonjour,

    Je dois réaliser des shells client serveur en UDP à l'aide des sockets avec des signaux.

    Les shell client serveur sont OK :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
     
    int main(int argc, char *argv[])
    {
        int sock;
    	int longAdresse;
    	int err;
        struct sockaddr_in adrServeur, adrClient;
        char buffer[1024];
     
        sock = socket(AF_INET, SOCK_DGRAM, 0);
     
        if (sock == -1)
        {
            perror("Erreur lors de la création de la socket");
            exit(-1);
        }
     
        adrServeur.sin_port = htons(9999);
        adrServeur.sin_addr.s_addr = inet_addr("127.0.0.1");
        adrServeur.sin_family = AF_INET;
     
    	adrClient.sin_port = htons(3000);
        adrClient.sin_addr.s_addr = inet_addr("127.0.0.1");
        adrClient.sin_family = AF_INET;
     
        err = bind(sock, (struct sockaddr*)&adrClient, sizeof(adrClient)) ;
    	if(err == -1)
        {
            perror("Erreur lors du bind");
        }
     
        printf("Taper une chaine de caracteres en minuscules : ");			
    	scanf("%s", &buffer);
     
        err = sendto(sock, &buffer, sizeof(buffer), 0, (struct sockaddr*) &adrServeur, sizeof(adrServeur));
    	if(err == -1)
        {
            perror("Error a l'ecriture");
        }
     
        longAdresse = sizeof(adrServeur);
        err = recvfrom(sock, &buffer, sizeof(buffer), 0, (struct sockaddr*)&adrServeur, &longAdresse) ;
    	if (err == -1)
        {
            perror("Erreur a la lecture");
        }
     
        close(sock);
     
        exit(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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
     
    int main(int argc, char *argv[])
    {
        int sock; 
    	int longAdresse;
    	int err;
        struct sockaddr_in adrServeur, adrClient;
        char buffer[1024];
    	int i = 0;
     
        sock = socket(AF_INET, SOCK_DGRAM, 0);
     
        if (sock == -1)
        {
            perror("Erreur a la création");
            exit(-1);
        }
     
        adrServeur.sin_family = AF_INET;
        adrServeur.sin_port = htons(9999);
        adrServeur.sin_addr.s_addr = inet_addr("127.0.0.1");
     
        err = bind(sock, (struct sockaddr*)&adrServeur, sizeof(adrServeur)) ;
    	if(err == -1)
        {
            perror("Erreur lors du bind");
        }
     
        while(1)
        {
    		longAdresse = sizeof(adrClient);
            err = recvfrom(sock, &buffer, sizeof(buffer), 0, (struct sockaddr*)&adrClient, &longAdresse);
    		if(err == -1)
            {
                perror("Erreur de reception");
            }
            else
            {
    		   for (i=0;i<sizeof(buffer);i++)
    		   {
    			   buffer[i] = toupper(buffer[i]);
    		   }	
               printf("Réponse : %s\n",buffer);
               fflush(0);
     
               err = sendto(sock, &buffer, sizeof(buffer), 0, (struct sockaddr*)&adrClient, sizeof(adrClient));
    		   if(err == -1)
               {
                   perror("Erreur a l'envoi");
               }
            }
            break;
        }
     
        close(sock);
     
        exit(0);
    }
    Je ne sais pas du tout se que je dois ajouter pour réaliser des signaux ?
    Apparemment il faut utiliser SigIOHandler...

    Il y a vraiment peu d'infos je suis perdu...

    Merci.

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Avec si peu d'information ça va être dur, il faut que tu demandes des informations complémentaires. Malgré tout, on peut facilement deviner ce que tu dois faire.

    Je pense que les signaux n'ont pas de réel incidences sur le fait que ça soit un client-serveur, tu dois surement intercepter les signaux d'arrêt du processus pour fermer proprement la connexion, ou encore faire d'autres actions. Tu peux aller regarder comment fonctionne la fonction "signal" sous linux.

    Ensuite dans ton programme il y a un problème, à chaque fois que tu détectes une erreur, tu l'affiches via perror et puis après tu ne fais plus rien ! Ce qui veut dire que le programme continue tout seul son cours... Donc ça foire si il y a une erreur. Il faut que tu quittes ou fassent quelque chose d'autre.
    Et juste comme ça, ton fflush(0); ne sert à rien

  3. #3
    Membre confirmé Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Par défaut Les signaux
    Merci de votre réponse,

    Apparemment, on envoie un paquet UDP depuis le client et le serveur doit l'intercepter et renvoyer un signal.

    Merci

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Alors peut-être que ce que tu dois faire c'est :

    1) Tout d'abord implémenter ton client/serveur sans le signal et afficher un message à chaque fois que tu reçois un paquet.
    2) Masquer SIGUSR1 par exemple via sigaction et coder une fonction d'interception qui affiche le même message que en 1).
    3) A chaque fois que tu reçois un paquet, envoyer SIGUSR1 à ton programme (la fonction affichera alors le message).

    Par contre ça me semble tiré par les cheveux car c'est un peu inutile. Enfin, tu devrais demander des infos supplémentaires.

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

Discussions similaires

  1. Programmation systeme en C et les signaux
    Par Traboulidon dans le forum Réseau
    Réponses: 27
    Dernier message: 06/02/2007, 10h32
  2. Soucis avec les signaux
    Par meuble2001 dans le forum C
    Réponses: 5
    Dernier message: 24/01/2007, 14h11
  3. utiliser une classe pour gerer les signaux
    Par TrueBeliever dans le forum Qt
    Réponses: 2
    Dernier message: 21/12/2006, 17h57
  4. Outils pour trapper les signaux
    Par ericbardoux dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 22/11/2005, 13h41
  5. [C#] Gérer les signaux genre ctrl+c?
    Par BleudeBromothymol dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/11/2004, 15h32

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