2009-07-08 53 views
12

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

我因此想知道是否有任何特别的理由去选择一个类的功能比其他 - 被发送/ recv的功能网络写入/读取优化,做他们表现得更好,等等?或者它真的是任意使用哪些功能?在所有情况下,read()和write()的行为是否正确?

感谢您的见解!

回答

19

应该没有差别。从man 2 send引述:

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

只要你不想指定和send()标志就可以使用write()自由。

+0

FreeBSD或其他平台也是如此吗? - 该行不会出现在我的send(2)手册页中。 – 2014-03-18 23:34:03

+0

@GoodPerson它适用于所有平台。如果不是这样,`inetd`之类的将不起作用。 (`inetd`把你的套接字放进你的守护进程的标准输入和标准输出中,你的进程可以用正常的方式直接与标准输入和标准输出进行交互,而不必知道它们是套接字。当然,你也可以使用套接字。 ) – 2014-11-29 06:43:39

6

recvsend允许您指定的标志,如出带外数据包。如果你不需要指定标志,readwrite就足够了。

1

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

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

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