J'ai encore un petit soucis avec select() enfin c'est plutot un improvement
Je bosse sur une appli serveur avec reception/envois de messages tcp.
Je fais des read non bloquants mais j'aimerais faire aussi des send non bloquants.
Je ne comprend pas comment c'est possible avec select() donc si quelqu'un a un bout de code avec un send non bloquant avec un select, je suis preneur.
Merci
Publicité
Posté le 03-06-2004 à 17:14:02
torpe23
Posté le 03-06-2004 à 17:21:54
select(), c'est pour attendre, donc je ne pense pas que ça soit ton cas.
Par contre, si tu fais man send, tu auras des infos intéressantes. Genre, utiliser write() au lieu de send() avec un flag spécial!
Bobarctor
Posté le 03-06-2004 à 17:26:08
oui mais select() c'est aussi pour voir si un descripteur est pret en lecture/ecriture... c'est aussi pour rendre un programme non bloquant.
Justement le man de send est explicite a ce sujet en indiquant que send() peut bloquer si la stack ip de l'appli en face est surcharge, blocage qui survient si cette stack est surchargee.
Il y a bien la solution qui permet de creer cette socket en mode non bloquant, mais le truc c'est que mon programme doit etre portable et que cette soluce ne l'est pas.
oui mais select() c'est aussi pour voir si un descripteur est pret en lecture/ecriture... c'est aussi pour rendre un programme non bloquant.
Justement le man de send est explicite a ce sujet en indiquant que send() peut bloquer si la stack ip de l'appli en face est surcharge, blocage qui survient si cette stack est surchargee.
Il y a bien la solution qui permet de creer cette socket en mode non bloquant, mais le truc c'est que mon programme doit etre portable et que cette soluce ne l'est pas.
Il n'y a pas de solution totalement portable et vous serez probablement obligé d'utiliser des bons gros #ifdef. Sinon, à votre place, j'utiliserai ioctl (sous unix) et ioctlsocket (sous win32) pour passer la socket en mode non-bloquant.
Bobarctor
Posté le 04-06-2004 à 08:45:24
En fait en sondant un peu tout le monde autour de moi on m'a conseillé d'utiliser les deux methodes:
- creer une socket non bloquante avec O_NONBLOCK
- multiplexer l'envois de paquets avec send.
Maintenant je pense que ça peut être pose sur papier comme suit:
- le descripteur sur lequel on veut envoyer quelque chose est mis et reste dans la pile de fd_set a examiner si et seulement si une partie du message n'a pu être transmise correctement, sinon on l'enleve de la pile.
Mon problème majeur c'est que je ne sais pas le coder d'où ma demande d'exemple
Bye
Message édité par Bobarctor le 04-06-2004 à 11:05:12