我正在使用典型的套接字API在Linux平台上用C ++编写网络应用程序,我正在研究将字节数组写入TCP流的两种替代方法:通过调用write()或者调用send()。我知道,因为这是Linux,套接字句柄只是一个文件描述符,因此在套接字上执行read()和write()调用是有效的,但套接字API也提供了send()和recv( )执行相同任务的功能。
因此,我想知道是否有任何特殊原因选择一类功能而不是另一类功能 - 是针对网络写入/读取优化的发送/接收功能,它们是否表现更好等等?或者我使用哪些功能真的是武断的? read()和write()在所有情况下都能正常运行吗?
感谢您的任何见解!
答案 0 :(得分:20)
应该没有区别。引自man 2 send
:
send()
和write()
之间的唯一区别是标志的存在。使用零标志参数,send()
相当于write()
。
只要您不想为send()
指定和标记,就可以自由使用write()
。
答案 1 :(得分:6)
recv
和send
允许您指定标志,例如用于带外数据包。如果您不需要指定标记,read
和write
就足够了。
答案 2 :(得分:1)
write
v.s. send
对于单个字节,或单个数组可能不会有太大的不同 - 它们很快会以相同的代码路径结束(最终它们执行相同的操作)。网络传输的开销极不可能达到这个水平;它将实际的TCP连接并通过电线移动位。
但是,如果您打算一次性发送大型多部分消息,则应查看sendmsg()
系统调用 - 这允许您指定要发送的非连续数据数组的列表。
在一天结束时,正常的指导方针适用 - 首先编写应用程序,然后进行基准测试,看看你的瓶颈在哪里。