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

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

6 ответов


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


Per первый удар по 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() нет, что делает его более мощным, или, по крайней мере, более удобным. Это одно отличие. Я не думаю, что есть существенная разница в производительности, но не проверял его.