Forum Linux.noyau Mon buffer de socket se remplit il ?

Posté par .
Tags : aucun
0
2
juil.
2007
Bonjour,
J'ai créé un module qui ouvre une socket....
Je voudrais déclenché l'appel à une fonction à la réception de données dans ma socket sans avoir besoin de faire un pooling.

Est ce faisable? Comment ?

Merci.
  • # Select ?

    Posté par . Évalué à 3.

    man select()
    • [^] # Re: Select ?

      Posté par (page perso) . Évalué à 2.

      Bon soit tu conçois ton programme comme un boucle avec un select au milieu qui attend sur le buffer.

      Dans ce cas là ton mail va devenir grosso modo ça :

      int main(int argc, char **argv)
      {
      fd_set rfds;
      struct timeval tv;
      int retval;
      while(1)
      {
      //Reset du descripteur de flux
      FD_ZERO(&rfds);
      // Surveiller stdin (fd 0) en attente d'entrées
      //XXX: change pour ton buffer ici
      FD_SET(0, &rfds);

      // Pendant 5 secondes maxi
      tv.tv_sec = 5;
      tv.tv_usec = 0;

      retval = select(1, &rfds, NULL, NULL, &tv);
      // Considérer tv comme indéfini maintenant !

      if (retval == -1)
      perror("select()");
      else if (retval)
      {
      printf("Données disponibles maintenant\n");
      /* FD_ISSET(0, &rfds) est vrai */
      if (strcmp(ta_string_lue, "exit"))
      break;
      }
      else
      printf("Pas de données depuis 5 secondes\n");
      }

      return EXIT_SUCCESS;
      }

      Soit tu embarque ce select dans une boucle pour traiter le boulot pendant que tu fais autre chose.
      Dans ce cas tu a besoin d'un descripteur supplémentaire qui te permettra du main() de réveiller le select en lui envoyant un "exit" ou autre sur ce flux
      • [^] # Re: Select ?

        Posté par . Évalué à 0.

        C'est pas terrible pour mettre dans un module....car le "select" est bloquant.
        Sous Windows il y a l'évènement DataArrival... Je suis étonné que sous Linux on ne puisse pas savoir a quel moment on reçoit des données dans la socket.
        • [^] # Re: Select ?

          Posté par . Évalué à 1.

          1. Tu peux rendre le select() non bloquant avec fcntl() et O_NONBLOCK sur tes sockets.

          2. Pourquoi ne pas utiliser un thread qui se serait en écoute sur le socket et qui appellerait ta fonction quand des données sont disponibles ?
          • [^] # Re: Select ?

            Posté par (page perso) . Évalué à 1.

            Merde je sais pas ce qui s'est passé je voulais rajouter ça dans mon message.
            Merde, comme j'ai pu envoyer un message imputé de la moitié du texte O_o.
            Bon je vais devoir dormir un peu plus alors...
  • # dico anglais...

    Posté par . Évalué à 1.

    "polling" et pas "pooling".


    poll:
    poll (opinion) nm sondage (opinion)
    poll (politics: vote) nf consultation (politique : vote)
    poll (survey) nf enquête
    poll (conduct survey) vtr sonder ⇒ (pour opinion)



    pooling:
    pooling nm groupement (d'intérêts - Com & Industriel)
    pooling v grouper ; (ressources)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.