Bonjour à tous,
Cela fait quelque jours que j'apprends à me servir des sockets pour réaliser deux mini-applications (client/serveur). J'utilise le mode de transfert TCP et mon serveur est "multi-threadé". Tout fonctionne nickel pour l'instant (je n'ai pas encore effectué les modifications nécessaires pour la portabilité sous Windows, donc pour l'instant c'est fonctionnel sous Linux et Mac OS X uniquement). J'aimerais cependant améliorer certains points et obtenir certaines informations.
J'ai remarqué (même si je sais que c'est normal) que lorsque j'utilise read() sur un flux, si rien n'est reçu le temps d'expiration est assez long. Je pensais me servir de setsockopt() mais les paramètres contrôlant ce temps d'expiration (SO_SNDTIMEO et SO_RCVTIMEO) ne sont pas modifiables d'après ce site de référence. Du coup la seule solution que je vois pour raccourcir moi-même ce temps serait de limiter le temps d'exécution de cette fonction grâce à SIGALRM, mais je ne trouve pas ça très propre. Y a-t-il une autre solution ?
Sinon je me demandais s'il y avait une différence entre utiliser read()/write() pour les flux sur le réseau et recv()/send(). J'ai vu que ces deux dernières fonctions peuvent prendre un 4e argument mais je ne m'en sers jamais. J'ai voulu l'utiliser une fois lorsque je ne comprenais pas pourquoi j'obtenais un SIGPIPE chez le serveur quand le client interrompait la connexion et l'argument MSG_NOSIGNAL m'aurait peut-être servi s'il existait sur mon OS... je n'ai pas trouvé la définition de la constante alors qu'elle devrait normalement être dans /usr/include/sys/socket.h il me semble. Donc pour en revenir à read()/write() et recv()/send(), y a-t-il une différence ?
Et enfin dernier point, est-il possible d'utiliser en simultané le même flux par deux threads distincts, l'un s'occupant de la lecture et l'autre de l'écriture ? Je doute très franchement que cela soit faisable mais je préfère m'en assurer. J'ai envisagé cette solution car je cherche à permettre à l'utilisateur de se servir du logiciel tout en ayant en fond la connexion et les envois/réceptions au serveur. Je trouve gênant de ne pas pouvoir envoyer d'informations simplement parce que je surveille aussi l'arrivée de requêtes ou d'autres informations. Je ne sais pas comment est organisé l'envoi et la réception des données sur ce genre de logiciels, donc si vous avez des avis sur ce point, je suis preneur.
Merci pour votre aide,
Spootnik
Partager