web-dev-qa-db-fra.com

Quelle est la différence entre read () et recv () et entre send () et write ()?

quelle est la différence entre read () et recv () et entre send () et write () en programmation de socket? performances, vitesse et autres comportements.

174
Sajad Bahmani

La différence est que recv()/send() ne fonctionne que sur les descripteurs de socket et vous permet de spécifier certaines options pour l'opération en cours. Ces fonctions sont légèrement plus spécialisées (par exemple, vous pouvez définir un indicateur pour ignorer SIGPIPE, ou pour envoyer des messages hors bande ...).

Les fonctions read()/write() sont les fonctions de descripteur de fichier niversel fonctionnant sur tous les descripteurs.

114
Gonzalo

Per le premier coup sur Google

read () est équivalent à recv () avec un paramètre flags de 0. Les autres valeurs du paramètre flags modifient le comportement de recv (). De même, write () est équivalent à send () avec flags == 0.

82
Jonathan Feinberg

read() et write() sont plus génériques, ils fonctionnent avec n'importe quel descripteur de fichier. Cependant, ils ne fonctionneront pas sous Windows.

Vous pouvez passer des options supplémentaires à send() et recv(), de sorte que vous devrez peut-être les utiliser dans certains cas.

11
Bastien Léonard

Je viens de remarquer récemment que lorsque j’utilisais write() sur un socket sous Windows, cela fonctionnait presque (le FD transmis à write() n'est pas le même que celui transmis à send(); J'ai utilisé _open_osfhandle() pour que le FD passe à write()). Cependant, cela n’a pas fonctionné lorsque j’ai essayé d’envoyer des données binaires contenant le caractère 10. write(), quelque part, le caractère 13 inséré auparavant. Le changer en send() avec un paramètre flags de 0 corrigea ce problème. read() pourrait avoir le problème inverse si 13-10 sont consécutives dans les données binaires, mais je ne l'ai pas testé. Mais cela semble être une autre différence possible entre send() et write().

7
ajb

Une autre chose sur linux est:

send ne permet pas de fonctionner sur des fd non-socket. Ainsi, par exemple, pour écrire sur le port USB, write est nécessaire.

6
Mert Mertce

"Performance et vitesse"? Ce genre de ... synonymes, ici?

Quoi qu'il en soit, l'appel recv() utilise des indicateurs que read() ne gère pas, ce qui le rend plus puissant ou du moins plus pratique. C'est une différence. Je ne pense pas qu'il y ait une différence de performance significative, mais je ne l'ai pas testée.

3
unwind