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 :

problème avec la fonction select()


Sujet :

Réseau C

  1. #1
    Membre du Club Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Points : 52
    Points
    52
    Par défaut problème avec la fonction select()
    Bonjour!
    j'ai un petit problème pour utiliser la fonction select.
    ce que je voudrais réussir à faire en fait c'est que mon client soit en attente d'évènements venant de la part du serveur et qu'il réagisse en fonction (si c'est un évènement d'écriture, de lecture... ou si trop de temps c'est écoulé...)

    donc voilà ce que j'ai fait coté 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
    while(boolll==ON)
    {
      fd_set readfs;
      FD_ZERO (&readfs);      /* clears readfs */
      FD_SET (sock, &readfs); /* adds a stream */
      fd_set writefs;
      FD_ZERO (&writefs);      /* clears readfs */
      FD_SET (sock, &writefs); /* adds a stream */
    /* set the timer to 1.5 second */
          struct timeval timeout;
     
          timeout.tv_sec = 1; /* 1 s */
          timeout.tv_usec = 5 * 100 * 1000; /* 500 ms */
     
      int err2 = select (sock + 1, &readfs, &writefs, NULL, &timeout);
     
          switch (err2)
          {
          case 0:
             /* timeout */
    	 boolll==OFF;
             break;
     
          case -1:
             /* error */
             puts ("error\n");
             boolll==OFF;
             break;
     
          default:
             /* stream event */
     
             /* - data has been received */
     
             if (FD_ISSET (sock, &readfs))
             {
                printf("lecture\n");
                int err = SSL_read(ssl, buf, sizeof(buf)-1);
    	    if (err <= 0)
                    {
    	        perror("call to read\n");
    	        exit(-5);
    	        }
                buf[err] = '\0';        
                printf ("Received %d chars:'%s'\n", err, buf); 
             }
     
             /* - data has been sent */
             if (FD_ISSET (sock, &writefs))
             {
                printf("ecriture\n");
                int err = SSL_write(ssl, hello, sizeof(hello));
    	    if (err <= 0)
                    {
    	        perror("call to write\n");
    	        exit(-5);
    	        }
             }
    }
    coté serveur, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      /* Receive data from the SSL client */      
      err = SSL_read(ssl, buf, sizeof(buf) - 1);      
      RETURN_SSL(err);        buf[err] = '\0';        
      printf ("Received %d chars:'%s'\n", err, buf);  
     
     
    //////////////////////////////////////////////////////////////////////////
      /* Send data to the SSL client */   
      err = SSL_write(ssl, "This message is from the SSL server",strlen("This message is from the SSL server"));                 
      RETURN_SSL(err);
    et le client n'a pas l'air de se mettre en attente d'évènement lecture...
    est ce que c'est du au fait que j'utilise SSL? ou alors est ce que j'ai raté un truc sur la fonction select?

    merci par avance pour vos réponses
    Parce que je nêm bien râler moi...

  2. #2
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Je pense que ton problème vient du fait que tu attends la disponibilité de la socket en écriture, et pas seulement en lecture.

    Du coup, je pense que ça boucle à l'infini.

    Il faudrait donc faire un test de nécessité d'écriture avant d'ajouter ta socket au fd_set lié à l'écriture.

    Bon courage pour la suite.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  3. #3
    Membre du Club Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Points : 52
    Points
    52
    Par défaut
    merci pour ta réponse...
    par contre je n'ai pas tout compris...
    c'est bien possible d'attendre la disponibilité en écriture ou en lecture en même temps non?
    faire un test de nécessité d'écriture avant d'ajouter ta socket au fd_set lié à l'écriture
    quésaco...??
    Parce que je nêm bien râler moi...

  4. #4
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Citation Envoyé par Bathou Voir le message
    c'est bien possible d'attendre la disponibilité en écriture ou en lecture en même temps non?

    quésaco...??
    Si tu attends l'écriture et que tu veux lire, la fonction select() passera car la socket peut en effet être écrite.

    Si tu fais un test de validité de données à écrire avant d'ajouter l'écriture au test, la fonction select() attendra uniquement la lecture.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  5. #5
    Membre du Club Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Points : 52
    Points
    52
    Par défaut
    je ne vois pas trop ce qu'il faut que je fasse en fait...

    parce que ce que je voulais faire : en fait ma socket se connecte et je voulais donc utiliser le select pour voir les évènements à venir... si c'est un évènement d'écriture que le serveur attend, ben je fais un SSL_connect la première fois et un SSL_write ; et si c'est un évènement de lecture que le serveur attend ben je fais un SSL_read...

    donc du coup, j'étais partie sur ce que j'avais mis plus haut mais j'ai un peu de mal...
    Parce que je nêm bien râler moi...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut SSL et select c'est compliqué.
    La raison fondamentale en est que SSL travaille sur des "records" alors que select travaille sur des flots d'octets. L'implication en est que c'est pas parce que select va retourner "il y a des données à lire" que les données "lues" suffisent à remplir le "records" attendu par SSL_read.

    Vous trouverez des exemples notament
    An Introduction to OpenSSL Programming (PartI) et (Part II)
    Votre soucis est décrit dans part II.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club Avatar de Bathou
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Points : 52
    Points
    52
    Par défaut
    merci... les pdf imprimés sont sur mon bureau depuis un petit bout de temps déjà... je n'avais pas vu que la partie 2 parlait d'autres choses que les sessions...

    j'ai honte...

    Parce que je nêm bien râler moi...

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

Discussions similaires

  1. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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