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

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

Ответ 1

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

Функции read()/write() - это универсальные функции файловых дескрипторов, работающие со всеми дескрипторами.

Ответ 2

Пер первый хит в Google

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Другое дело в Linux:

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

Ответ 6

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

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