read()和recv()之间以及send()和write()之间有什么区别?

在socket编程中,read()和recv()之间以及send()和write()之间有什么区别? 性能和速度等行为。

唯一的区别是recv / send可以让你为实际操作指定某些选项。 读/写是'通用'文件描述符function,而recv / send稍微更专门(例如,可以设置一个标志来忽略SIGPIPE,或发送带外消息…)。

每Google上的第一个命中

read()与flags参数为0的recv()等价。flags参数的其他值改变了recv()的行为。 同样,write()等价于send()的标志== 0。

read()write()更通用,它们可以处理任何文件描述符。 但是,他们不会在Windows上工作。

您可以将其他选项传递给send()recv() ,因此在某些情况下可能需要使用它们。

我刚刚注意到,当我在Windows的套接字上使用write()时,它几乎工作(传递给write()的FD与传递给send()传递不同;我使用_open_osfhandle()获取FD传递给write() )。 但是,当我试图发送二进制数据,其中包括字符10. write()之前插入字符13之前,它不起作用。 将其更改为使用flags参数0的send()可以解决该问题。 如果13-10在二进制数据中是连续的,则read()可能会出现相反的问题,但是我没有对它进行testing。 但是,这似乎是send()write()之间的另一个可能的区别。

“性能和速度”? 这不是那种…同义词吗?

无论如何, recv()调用的标志read()不会,这使得它更强大,或者至less更方便。 这是一个区别。 我不认为有显着的性能差异,但没有testing它。

在Linux上的另一件事是:

send不允许在非socket fd上操作。 因此,例如在USB端口上writewrite是必要的。