写入套接字时使用write()而不是send()的性能影响

时间:2009-07-08 20:38:14

标签: c++ sockets network-programming

我正在使用典型的套接字API在Linux平台上用C ++编写网络应用程序,我正在研究将字节数组写入TCP流的两种替代方法:通过调用write()或者调用send()。我知道,因为这是Linux,套接字句柄只是一个文件描述符,因此在套接字上执行read()和write()调用是有效的,但套接字API也提供了send()和recv( )执行相同任务的功能。

因此,我想知道是否有任何特殊原因选择一类功能而不是另一类功能 - 是针对网络写入/读取优化的发送/接收功能,它们是否表现更好等等?或者我使用哪些功能真的是武断的? read()和write()在所有情况下都能正常运行吗?

感谢您的任何见解!

3 个答案:

答案 0 :(得分:20)

应该没有区别。引自man 2 send

  

send()write()之间的唯一区别是标志的存在。使用零标志参数,send()相当于write()

只要您不想为send()指定和标记,就可以自由使用write()

答案 1 :(得分:6)

recvsend允许您指定标志,例如用于带外数据包。如果您不需要指定标记,readwrite就足够了。

答案 2 :(得分:1)

write v.s. send对于单个字节,或单个数组可能不会有太大的不同 - 它们很快会以相同的代码路径结束(最终它们执行相同的操作)。网络传输的开销极不可能达到这个水平;它将实际的TCP连接并通过电线移动位。

但是,如果您打算一次性发送大型多部分消息,则应查看sendmsg()系统调用 - 这允许您指定要发送的非连续数据数组的列表。

在一天结束时,正常的指导方针适用 - 首先编写应用程序,然后进行基准测试,看看你的瓶颈在哪里。