В чем разница между read()
и recv()
и между send()
и write()
в программировании сокетов с точки зрения производительности, скорости и других характеристик?
В чем разница между read() и recv() и между send() и write()?
Ответ 1
Разница в том, что recv()
/send()
работают только с дескрипторами сокетов и позволяют указывать определенные параметры для реальной операции. Эти функции немного более специализированы (например, вы можете установить флаг, чтобы игнорировать SIGPIPE
или отправлять внеполосные сообщения...).
Функции read()
/write()
- это универсальные функции файловых дескрипторов, работающие со всеми дескрипторами.
Ответ 2
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()
не делает, что делает его более мощным или, по крайней мере, более удобным. Это одно отличие. Я не думаю, что существует значительная разница в производительности, но не проверена.