В чем разница между read() и recv(), а также между send() и write()?


в чем разница между read() и recv() , а также между send() и write() в программировании сокетов ? производительность, скорость и другое поведение.

6 157

6 ответов:

единственная разница заключается в том, что recv/send позволяет указать определенные параметры для фактической операции . чтение / запись являются "универсальными" функциями дескриптора файла, в то время как recv/send немного более специализированы (например, вы можете установить флаг для игнорирования SIGPIPE или для отправки внеполосных сообщений...).

на первый хит на Google

read() эквивалентно recv () с параметром flags равным 0. Другие значения параметра flags изменяют поведение recv (). Аналогично, write() эквивалентно send () с флагами == 0.

read() и write() более универсальные, они работают с любым дескриптором файла. Однако, они не будут работать на Windows.

вы можете передать дополнительные параметры для send() и recv(), поэтому вы можете использовать их в некоторых случаях.

Я только недавно заметил, что когда я использовал write() на сокете в Windows, он почти работает (FD передается в write() Это не то же самое, что передано в send(); я использовал _open_osfhandle() чтобы получить FD, чтобы перейти к write()). Однако это не сработало, когда я попытался отправить двоичные данные, которые включали символ 10. write() где-то вставлен символ 13 до этого. Изменение его на send() с параметром flags 0 исправлена эта проблема. read() может иметь обратную проблему, если 13-10 последовательный в двоичных данных, но я не проверял его. Но это, кажется, еще одно возможное различие между send() и write().

еще одна вещь в linux:

send не позволяет работать на не-гнезде fd. Таким образом, например писать на usb порт,write необходимо.

"скорость"? Разве это не так?.. синонимы, здесь?

все равно recv() вызов принимает флаги, которые read() нет, что делает его более мощным, или, по крайней мере, более удобным. Это одно отличие. Я не думаю, что существует значительная разница в производительности, но не проверял ее.