请教关于socket编程的send函数!(TCP)
刚看到一篇文章是关于 socket编程在TCP的情况下,使用send函数时,阻塞与非阻塞的区别,详见下面这篇文章:
http://www.cppblog.com/artmouse/archive/2005/12/14/1762.aspx
这篇文章的大意是讲:
1 在socket阻塞时,send一定会等到将想要发送的数据copy到缓冲区为止(不管要发送的数据有多大),也就是说这个时候send返回的长度一定等于要发送的数据的长度,所以此时也不用循环send;
2 在socket非阻塞时,send返回的长度可能小于要发送的数据的长度,所以此时用循环send;
但是我做的实验发现:
a 不论要发送的数据要多大(我发送的数据大小是1M,发送缓冲区是8K)
b 不论阻塞还是非阻塞
send返回的值总是等于要发送的数据的长度,也就是说一次就发送完了(或者说Copy到缓冲区了)。
请问:
i http://www.cppblog.com/artmouse/archive/2005/12/14/1762.aspx 这篇文章讲的是否对?(我认为这篇文章对)
ii 我的实验结果怎么解释
PS:我的实验环境是win7,TCP 的server,client在同一台机器。
你的实验方法不对,不能在同一个机器上做,同一台机器上发,数据包发到环回地址上直接反弹了,底层实际上是通过命名管道走的,没有走网卡。由于速度非常快,所以异步发送时,一次可以全部发送完,这并不代表异步发送可以和同步发送一样处理。你如果向一个网速较慢的机器上发,你就会发现实际发送的数据量和你要发送的有区别了。
如果你发送1M,就给你1M的缓冲区,要是你发送1G,那还不得给你1G的缓冲区.所谓缓冲区,是指衔接多个速率不一致的I/O设备的中转站,通过一定的算法平衡速率不一致造成的CPU时钟周期浪费.因此,这个buffer的东西有个固定分配算法,有个基数,然后有个倍数,只有当写速率大于发速率的时候,才会增加BUFFER的大小.
socket.NoDelay = true;