socket编程中read()和recv()之间以及send()和write()之间的区别是什么?性能和速度等行为。read()和recv()之间以及send()和write()之间有什么区别?
回答
唯一的区别是recv/send允许您为实际操作指定某些选项。读/写是'通用'文件描述符函数,而recv/send稍微更专用(例如,可以设置一个标志来忽略SIGPIPE或发送带外消息...)。
这是不正确的,在0长度的数据报的情况下还有一个区别 - 如果一个零长度的数据报未决,请阅读(2)和recv()零标志 提供不同的行为。在这种情况下, read(2)不起作用(数据报保持未决),而recv() 消耗未决的数据报。 – 2017-02-11 08:44:16
@AbhinavGauniyal如何提供不同的行为_?如果有一个0字节的数据报,'recv'和'read'都不会向调用者提供数据,但也没有错误。对于调用者来说,行为是一样的。调用者可能甚至不知道关于数据报的任何事情(它可能不知道这是一个套接字而不是一个文件,它可能不知道这是一个数据报套接字而不是一个流套接字)。数据报保持悬而未决是关于IP堆栈如何在内核中工作以及调用者不可见的隐含知识。从来电角度来看,他们仍然会提供平等的行为。 – Mecki 2017-07-19 16:51:20
@Mecki这不是每个人的隐性知识,以我为例:) – 2017-07-20 12:12:32
“性能和速度”?这不是那种......同义词吗?
无论如何,recv()
调用需要标记read()
没有,这使得它更强大,或者至少更方便。这是一个区别。我不认为有显着的性能差异,但没有经过测试。
也许不必处理国旗可能会更方便。 – semaj 2009-11-24 16:16:08
读()等效于的recv()为0的标志参数的其它值的标志参数改变的recv的()的行为。同样,write()相当于send()的标志== 0。
这不是整个故事。 'recv'只能在套接字上使用,并且如果试图在'STDIN_FILENO'上使用它,则会产生错误。 – 2011-07-31 05:29:12
此线程现在是Google上的第一次打击,Google喜欢stackoverflow – Eloff 2013-01-08 21:14:14
read()
和write()
更通用,它们可以处理任何文件描述符。 但是,它们不适用于Windows。
您可以将其他选项传递给send()
和recv()
,因此您可能必须在某些情况下使用它们。
我刚刚注意到,当我在Windows套接字使用write()
,它几乎将工作(FD传递给write()
是不一样的一个传递到send()
;我用_open_osfhandle()
获得FD传递给write()
)。但是,当我尝试发送包含字符10的二进制数据时,它不起作用。write()
某处插入字符13之前。使用flags参数0将其更改为send()
可解决该问题。如果13-10在二进制数据中是连续的,那么read()
可能会出现相反的问题,但我没有对它进行测试。但这似乎是send()
和write()
之间的另一个可能的差异。
+1。另请参见[winsock不支持读/写](http://stackoverflow.com/q/4778043) – 2014-06-19 15:14:21
另一件事上linux是:
send
不允许对非套接字fd操作。因此,例如写在USB端口上,write
是必要的。
- 1. save-hook-hook和write-file-function之间有什么区别
- 2. submit()函数和send()JavaScript函数之间有什么区别?
- 3. aio_write()和O_NONBLOCK write()之间的区别
- 4. configure.ac和configure.in以及Makefile.am和Makefile.in之间的区别是什么?
- 5. dpm()和dsm()之间有什么区别?
- 6. @dynamic和@synthesize之间有什么区别?
- 7. vbNullString和“”之间有什么区别吗?
- 8. * zoom和zoom之间有什么区别?
- 9. String.Concat,string.format和+之间有什么区别?
- 10. StaticLayout和DynamicLayout之间有什么区别
- 11. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之间有什么区别?
- 12. :: after和after之间有什么区别?
- 13. %.02f和%.2f之间有什么区别?
- 14. {$ var}和$ var之间有什么区别?
- 15. ReleaseFloatArrayElements和DeleteLocalRef之间有什么区别
- 16. {0}和“”之间有什么区别?
- 17. getA()和this.getA()之间有什么区别?
- 18. @observable和@published之间有什么区别
- 19. $ {}和#{}之间有什么区别?
- 20. url.getFile()和getpath()之间有什么区别?
- 21. KVC和Properties之间有什么区别?
- 22. Lazy.Force()和Lazy.Value之间有什么区别
- 23. “层”和“层”之间有什么区别?
- 24. 1.1em和1.05em之间有什么区别?
- 25. proc和lambda之间有什么区别?
- 26. ViewFlipper和ViewSwitcher之间有什么区别
- 27. typedef和宏之间有什么区别?
- 28. “$^N”和“$ +”之间有什么区别?
- 29. NSInvocation和block之间有什么区别?
- 30. -existingObjectWithID:error:和-objectWithID之间有什么区别?
认为写入像这样实现:'#define write(...)send(## __ VA_ARGS__,0)'。 – carefulnow1 2017-01-07 09:39:04