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.
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
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.
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...
# Select ?
Posté par Obsidian . Évalué à 3.
[^] # Re: Select ?
Posté par Raphaël G. (site web personnel) . Évalué à 2.
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 steven51 . Évalué à 0.
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 galactikboulay . Évalué à 1.
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 Raphaël G. (site web personnel) . Évalué à 1.
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 Plinn . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.