Envoyé par ram-0000
Au fait, si tu veux être portable, utilise recv() et non read() pour tes sockets...
Envoyé par ram-0000
Au fait, si tu veux être portable, utilise recv() et non read() pour tes sockets...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
La norme POSIX permet d'utiliser read() sur une socket. Les sockets Berkeley reposent sur recv() et send(), garanties marcher sur des sockets.
read() ne marche que sur les systèmes où les sockets sont des descripteurs. En clair, pas sous Windows, alors que Windows respecte l'interface des sockets Berkeley.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pourquoi ?
Il y a une API portable (sockets BSD), pourquoi ne pas l'utiliser ? De plus il y a un paramètre de plus qui pourrait avoir son rôle à jouer un jour ou l'autre... Utiliser read() et write() est un détournement de l'utilisation des sockets. Ce n'est pas la manière normale de procéder telle qu'elle a été conçue par BSD.
Une fois de plus, ce n'est pas parce que quelque chose est possible qu'elle est souhaitable.
P.S. Es-tu bien sûr que POSIX.1 définisse l'usage de read() et write() dans le cadre des sockets ?
Ici : http://www.opengroup.org/onlinepubs/.../socket.h.html
je ne vois pas de read() / write() ...
de même ici http://opengroup.org/onlinepubs/007908775/xsh/read.html
je ne vois pas de sockets.
Tu fais fausse route, les sockets Berkeley n'ont jamais été normalisé, ce n'est qu'une implémentation (reprise par Microsoft soit) mais pas une norme.
POSIX utilise le "fichier" comme abstraction, tout est fichier, si on regarde dans la norme on trouve :
alors que :pread, read - read from a file
...
If fildes refers to a socket, read() shall be equivalent to recv() with no flags set.
Donc sauf rare cas, pour être le plus générique possible, mieux vaut utiliser read() et write().recv - receive a message from a connected socket
C'est malheureusement une idée reçue mais fausse. Le X de POSIX n'est là que pour rappeler le fait que la plupart des fonctions viennent du monde UNIX, mais il ne veut pas dire "pour UNIX", le plus important est Portable Operating system Interface, d'ailleurs, le commité de normalisation fait le maximum pour retirer ces ambiguïtés des noms, comme pour AF_UNIX qui est devenu AF_LOCAL, mais ce n'est pas toujours aussi simple.
Partager