Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写入套接字时使用write()而不是send()对性能的影响 我正在使用典型的套接字API在Linux平台上编写C++网络应用程序,我正在研究2种可供选择的方法:将字节数组写入TCP流:通过调用WrreWe(或)调用Sead()。我知道,由于这是Linux,套接字句柄只是一个文件描述符,因此对套接字执行read()和write()调用是有效的,但是套接字API还提供send()和recv()函数来执行相同的任务_C++_Sockets_Network Programming - Fatal编程技术网

写入套接字时使用write()而不是send()对性能的影响 我正在使用典型的套接字API在Linux平台上编写C++网络应用程序,我正在研究2种可供选择的方法:将字节数组写入TCP流:通过调用WrreWe(或)调用Sead()。我知道,由于这是Linux,套接字句柄只是一个文件描述符,因此对套接字执行read()和write()调用是有效的,但是套接字API还提供send()和recv()函数来执行相同的任务

写入套接字时使用write()而不是send()对性能的影响 我正在使用典型的套接字API在Linux平台上编写C++网络应用程序,我正在研究2种可供选择的方法:将字节数组写入TCP流:通过调用WrreWe(或)调用Sead()。我知道,由于这是Linux,套接字句柄只是一个文件描述符,因此对套接字执行read()和write()调用是有效的,但是套接字API还提供send()和recv()函数来执行相同的任务,c++,sockets,network-programming,C++,Sockets,Network Programming,因此,我想知道选择一类函数而不是另一类函数是否有任何特殊的原因-发送/接收函数是否针对网络写入/读取进行了优化,它们的性能是否更好,等等?或者我使用的函数真的是任意的吗?read()和write()是否在所有情况下都正常工作 谢谢你的见解 recv和send允许您指定标志,例如带外数据包。如果不需要指定标志,read和write就足够了。应该没有区别。引用自man 2 send: send()和write()之间的唯一区别在于标志的存在。使用零标志参数,send()相当于write() 只要你不

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


谢谢你的见解

recv
send
允许您指定标志,例如带外数据包。如果不需要指定标志,
read
write
就足够了。

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

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


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

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

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


在一天结束时,通常的指导原则适用-首先编写应用程序,然后进行基准测试,以查看瓶颈所在。

在要接收/发送的非连续阵列上:readv和writev也允许这样做。很适合分散/聚集I/O!FreeBSD或其他平台也是如此吗该行不出现在我的发送(2)手册页中。@GoodPerson它适用于所有平台。如果不是这样的话,
inetd
之类的东西就不起作用了。(
inetd
将套接字复制到守护进程的stdin和stdout中,进程可以以正常方式直接与stdin和stdout交互,而不知道它们是套接字。当然,您也可以使用它们执行套接字操作。)