259 Stimmen

Was ist der Unterschied zwischen read() und recv(), und zwischen send() und write()?

Was ist der Unterschied zwischen read() y recv() und zwischen send() y write() in der Socket-Programmierung in Bezug auf Leistung, Geschwindigkeit und andere Verhaltensweisen?

169voto

Gonzalo Punkte 20122

Der Unterschied besteht darin, dass recv() / send() arbeiten nur mit Socket-Deskriptoren und lassen Sie bestimmte Optionen für die eigentliche Operation angeben. Diese Funktionen sind etwas spezieller (Sie können zum Beispiel ein Flag setzen, um die SIGPIPE oder zum Senden von Out-of-Band-Nachrichten...).

Funktionen read() / write() sind die universal Dateideskriptorfunktionen, die auf alle Deskriptoren wirken.

105voto

Jonathan Feinberg Punkte 43293

Per der erste Treffer bei Google

read() ist äquivalent zu recv() mit einem Flags-Parameter von 0. Andere Werte für den Flags-Parameter ändern das Verhalten von recv(). Analog dazu entspricht write() send() mit flags == 0.

19voto

Bastien Léonard Punkte 57728

read() y write() sind allgemeiner, sie funktionieren mit jedem Dateideskriptor. Allerdings funktionieren sie nicht unter Windows.

Sie können zusätzliche Optionen an send() y recv() Daher müssen Sie sie in einigen Fällen verwenden.

8voto

ajb Punkte 30610

Ich habe erst kürzlich festgestellt, dass ich bei der Verwendung von write() auf einem Socket in Windows, funktioniert es fast (der FD, der an write() ist nicht derselbe wie derjenige, der an send() ; ich habe _open_osfhandle() um den FD zu veranlassen, an write() ). Es funktionierte jedoch nicht, als ich versuchte, Binärdaten zu senden, die das Zeichen 10 enthielten. write() irgendwo vor diesem Zeichen 13 eingefügt. Ändern Sie es in send() mit einem Flags-Parameter von 0 hat dieses Problem behoben. read() könnte das umgekehrte Problem auftreten, wenn 13-10 in den Binärdaten aufeinander folgen, aber ich habe es nicht getestet. Aber das scheint ein weiterer möglicher Unterschied zu sein zwischen send() y write() .

7voto

Mert Mertce Punkte 1554

Eine andere Sache bei Linux ist:

send erlaubt es nicht, auf Nicht-Socket-FD zu arbeiten. So, zum Beispiel auf usb-Port zu schreiben, write notwendig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X