Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1237 connectés 

  FORUM HardWare.fr
  Programmation
  C

  multiplexage de sockets avec select() - 2eme parametre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

multiplexage de sockets avec select() - 2eme parametre

n°1082999
Shabang
Posté le 14-05-2005 à 07:34:16  profilanswer
 

Bonjour,
j'ai deja plusieurs fois utilise l'appel systeme select() pour creer des applications reseaux non bloquantes. Je n'ai jamais eu a passer en troisieme parametre de select (fd_set *writefds) autre chose que le pointeur nul, sans que ca m'aie pose probleme. Mais maintenant je me pose la question, quel serait l'utilite de détecter les ecritures sur un set de sockets grace a select, puisque c'est au programmeur de décider quand écrire des donnees sur la socket, non? (contrairement aux lectures qui doivent etre gerees par select() pour eviter de bloquer le flux de donnees). Existe-t-il des cas ou on pourrait s'en servir? (et eventuellement du 4eme parametre, fd_set *exceptfds)
Merci d'avance :)

mood
Publicité
Posté le 14-05-2005 à 07:34:16  profilanswer
 

n°1083010
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 09:32:46  profilanswer
 

Shabang a écrit :

j'ai deja plusieurs fois utilise l'appel systeme select() pour creer des applications reseaux non bloquantes. Je n'ai jamais eu a passer en troisieme parametre de select (fd_set *writefds) autre chose que le pointeur nul, sans que ca m'aie pose probleme. Mais maintenant je me pose la question, quel serait l'utilite de détecter les ecritures sur un set de sockets grace a select, puisque c'est au programmeur de décider quand écrire des donnees sur la socket, non?  


Le but n'est pas de détecter les ecritures, mais les fins d'écritures. Ca permet de ne pas balancer 40 Mo de données d'un coup aux sockets qui ne sauront pas les emettre sans cafouillage... On va plutôt émettre par blocs de 30 ou 40 ko, et envoyer la suite sur reception d'une information 'fin d'ecriture'.

Citation :


(contrairement aux lectures qui doivent etre gerees par select() pour eviter de bloquer le flux de donnees). Existe-t-il des cas ou on pourrait s'en servir? (et eventuellement du 4eme parametre, fd_set *exceptfds)


Le parametre 'exceptfds' sert à demander un déblocage sur des evènements urgents (signaux 'hors bande') tels qu'un demande de deconnexion de la part du distant, un ctrl-C (crtl-break) distant etc.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1083110
Shabang
Posté le 14-05-2005 à 12:50:49  profilanswer
 

Citation :

Le but n'est pas de détecter les ecritures, mais les fins d'écritures. Ca permet de ne pas balancer 40 Mo de données d'un coup aux sockets qui ne sauront pas les emettre sans cafouillage... On va plutôt émettre par blocs de 30 ou 40 ko, et envoyer la suite sur reception d'une information 'fin d'ecriture'.


Donc si j'ai bien compris, il y a une bufferisation des donnees lors de l'envoi sur la socket, a tel point que l'ecriture peut se faire apres l'execution de la routine d'ecriture (par exemple un write(2)), et se finir eventuellement pendant le select?
C'est dangereux de negliger ce phenomene pour des envois beacoup moins gros, comme des chaines de caractères de quelques dixaine d'octets (représentant un protocole de communication)?
Ce n'est pas bloquant d'envoyer la chaine d'un seul trait avec write(2), du moment qu'en face la lecture est non bloquante?

Citation :

Le parametre 'exceptfds' sert à demander un déblocage sur des evènements urgents (signaux 'hors bande') tels qu'un demande de deconnexion de la part du distant, un ctrl-C (crtl-break) distant etc.


C'est equivalent a regarder si read(2) sur la socket a renvoye 0 (auquel cas le distant s'est deconnecte) ?
Merci ;)


Message édité par Shabang le 14-05-2005 à 12:54:00
n°1083149
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 13:41:59  profilanswer
 

Shabang a écrit :

Citation :

Le but n'est pas de détecter les ecritures, mais les fins d'écritures. Ca permet de ne pas balancer 40 Mo de données d'un coup aux sockets qui ne sauront pas les emettre sans cafouillage... On va plutôt émettre par blocs de 30 ou 40 ko, et envoyer la suite sur reception d'une information 'fin d'ecriture'.


Donc si j'ai bien compris, il y a une bufferisation des donnees lors de l'envoi sur la socket, a tel point que l'ecriture peut se faire apres l'execution de la routine d'ecriture (par exemple un write(2)), et se finir eventuellement pendant le select?


Absolument. Il y a suffisament de buffers pour qu'un bloc pas trop gros (30..40 ko) puisse (vu de l'utilisateur) être envoyé en une fois, mais si il est vraiment énorme, on va manger énormément de ressources brutalement (pic), et ces ressources ne sont pas forcément disponibles, d'où un 'écrètage' et les pertes de données qui s'en suivent (perdre des données en émission, fait le faire quand même...). Le mécanisme de régulation est fourni par select() avec les évènements "write'.

Citation :


C'est dangereux de negliger ce phenomene pour des envois beacoup moins gros, comme des chaines de caractères de quelques dizaine d'octets (représentant un protocole de communication)?


En pratique, aucun risque, mais en toute rigueur, il faudrait appelet select() après tout write() de façon a syncroniser le processus (emission 'blocante')

Citation :


Ce n'est pas bloquant d'envoyer la chaine d'un seul trait avec write(2), du moment qu'en face la lecture est non bloquante?


En face, on ne sait pas ce qu'il y a. Effectivement, une ecriture avec write() n'est pas blocante.


Message édité par Emmanuel Delahaye le 14-05-2005 à 14:50:09

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1083169
Shabang
Posté le 14-05-2005 à 14:04:25  profilanswer
 

Vu! Je vais mettre tout ca en pratique. Merci encore :)

n°1083544
schnapsman​n
Zaford Beeblefect
Posté le 14-05-2005 à 20:38:22  profilanswer
 

Emmanuel Delahaye a écrit :

Le but n'est pas de détecter les ecritures, mais les fins d'écritures. Ca permet de ne pas balancer 40 Mo de données d'un coup aux sockets qui ne sauront pas les emettre sans cafouillage... On va plutôt émettre par blocs de 30 ou 40 ko, et envoyer la suite sur reception d'une information 'fin d'ecriture'.
[quote]


de la place sur le buffer d'envoi plus exactement [:maitre drasche]

n°1083867
Shabang
Posté le 15-05-2005 à 00:58:25  profilanswer
 

Emmanuel Delahaye a écrit :

En pratique, aucun risque, mais en toute rigueur, il faudrait appelet select() après tout write() de façon a syncroniser le processus (emission 'blocante')


D'apres le papier http://www.linuxinfor.com/french/man2/select_tut.html (la seule documentation detaillee de select que jai pu trouver), la technique est d'utiliser un buffer de taille fixe (et raisonnablement petite) pour l'envoi des donnees, pour etre certain que l'écriture se passe bien. L'envoi ne doit etre fait que si les buffers internes sont prets (en utilisant la macro FD_ISSET comme d'habitude), apres l'appel a select (ce qui permet en plus de gerer lectures & ecritures avec un seul select) si j'ai bien compris.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  multiplexage de sockets avec select() - 2eme parametre

 

Sujets relatifs
parametre a l'ouverture de fichier excel[SGBD] Procédure stockée, paramètre et clause IN
2 select dans un form[VC++] Paramètre en entrée d'1 appli en VC++
XMLEncoder et JTree - constructeur avec paramètre -[MySQL] Select degressif
[socket] select() ou fork()?Convertir requête Select en requête Update
[GTK] passer un parametre a une fonction callbackpb avec onchange dans un select
Plus de sujets relatifs à : multiplexage de sockets avec select() - 2eme parametre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR