wake-up-neo.com

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

was ist der Unterschied zwischen read () und recv () und zwischen send () und write () bei der Socket-Programmierung? Leistung und Geschwindigkeit und anderes Verhalten.

174
Sajad Bahmani

Der Unterschied besteht darin, dass recv()/send() nur für Socket-Deskriptoren funktioniert und Sie bestimmte Optionen für den tatsächlichen Vorgang angeben können. Diese Funktionen sind etwas spezialisierter (Sie können beispielsweise ein Flag setzen, um SIGPIPE zu ignorieren oder bandexterne Nachrichten zu senden ...).

Funktionen read()/write() sind die niversellen Dateideskriptorfunktionen, die für alle Deskriptoren gelten.

114
Gonzalo

Per der erste Treffer bei Google

read () entspricht recv () mit einem flags-Parameter von 0. Andere Werte für den flags-Parameter ändern das Verhalten von recv (). In ähnlicher Weise entspricht write () send () mit flags == 0.

82

read() und write() sind allgemeiner und funktionieren mit jedem Dateideskriptor. Unter Windows funktionieren sie jedoch nicht.

Sie können send() und recv() zusätzliche Optionen übergeben, sodass Sie diese in einigen Fällen möglicherweise verwenden müssen.

11

Ich habe kürzlich bemerkt, dass es fast funktioniert, wenn ich write() für einen Socket in Windows verwendet habe (die an write() übergebene FD ist nicht die gleiche wie die an send(); Ich habe _open_osfhandle() verwendet, um die FD an write() zu übergeben. Es funktionierte jedoch nicht, als ich versuchte, Binärdaten zu senden, die das Zeichen 10 enthielten. write() Davor wurde irgendwo das Zeichen 13 eingefügt. Das Ändern in send() mit einem Flags-Parameter von 0 behebt das Problem. read() könnte das umgekehrte Problem haben, wenn 13-10 in den Binärdaten aufeinander folgen, aber ich habe es nicht getestet. Dies scheint jedoch ein weiterer möglicher Unterschied zwischen send() und write() zu sein.

7
ajb

Eine andere Sache unter Linux ist:

send kann nicht mit fd ohne Socket betrieben werden. Um beispielsweise auf den USB-Port zu schreiben, ist write erforderlich.

6
Mert Mertce

"Leistung und Geschwindigkeit"? Sind das hier nicht ... Synonyme?

Wie auch immer, der recv() -Aufruf akzeptiert Flags, die read() nicht hat, was ihn leistungsfähiger oder zumindest praktischer macht. Das ist ein Unterschied. Ich glaube nicht, dass es einen signifikanten Leistungsunterschied gibt, habe ihn aber nicht getestet.

3
unwind