2009-11-24 86 views

回答

90

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

+1

这是不正确的,在0长度的数据报的情况下还有一个区别 - 如果一个零长度的数据报未决,请阅读(2)和recv()零标志 提供不同的行为。在这种情况下, read(2)不起作用(数据报保持未决),而recv() 消耗未决的数据报。 – 2017-02-11 08:44:16

+0

@AbhinavGauniyal如何提供不同的行为_?如果有一个0字节的数据报,'recv'和'read'都不会向调用者提供数据,但也没有错误。对于调用者来说,行为是一样的。调用者可能甚至不知道关于数据报的任何事情(它可能不知道这是一个套接字而不是一个文件,它可能不知道这是一个数据报套接字而不是一个流套接字)。数据报保持悬而未决是关于IP堆栈如何在内核中工作以及调用者不可见的隐含知识。从来电角度来看,他们仍然会提供平等的行为。 – Mecki 2017-07-19 16:51:20

+1

@Mecki这不是每个人的隐性知识,以我为例:) – 2017-07-20 12:12:32

3

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

无论如何,recv()调用需要标记read()没有,这使得它更强大,或者至少更方便。这是一个区别。我不认为有显着的性能差异,但没有经过测试。

+11

也许不必处理国旗可能会更方便。 – semaj 2009-11-24 16:16:08

67

the first hit on Google

读()等效于的recv()为0的标志参数的其它值的标志参数改变的recv的()的行为。同样,write()相当于send()的标志== 0。

+22

这不是整个故事。 'recv'只能在套接字上使用,并且如果试图在'STDIN_FILENO'上使用它,则会产生错误。 – 2011-07-31 05:29:12

+55

此线程现在是Google上的第一次打击,Google喜欢stackoverflow – Eloff 2013-01-08 21:14:14

8

read()write()更通用,它们可以处理任何文件描述符。 但是,它们不适用于Windows。

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

6

我刚刚注意到,当我在Windows套接字使用write(),它几乎将工作(FD传递给write()是不一样的一个传递到send();我用_open_osfhandle()获得FD传递给write())。但是,当我尝试发送包含字符10的二进制数据时,它不起作用。write()某处插入字符13之前。使用flags参数0将其更改为send()可解决该问题。如果13-10在二进制数据中是连续的,那么read()可能会出现相反的问题,但我没有对它进行测试。但这似乎是send()write()之间的另一个可能的差异。

+1

+1。另请参见[winsock不支持读/写](http://stackoverflow.com/q/4778043) – 2014-06-19 15:14:21

4

另一件事上linux是:

send不允许对非套接字fd操作。因此,例如写在USB端口上,write是必要的。

相关问题