日期:2014-05-16  浏览次数:20775 次

linux 网络编程 send 函数 的返回值是否会小于输入值?
我在书上看到这个代码,所以产生了疑问。
C/C++ code

size = strlen(cbuf);
totalSent = 0;
do
{
            bytesSent =
                send(sock, cbuf + totalSent,strlen(cbuf+totalSent), 0);
            if(bytesSent == -1)
                break;
            totalSent+=bytesSent;
}
while(totalSent < size);



如果改用write会怎样?

------解决方案--------------------
你这代码有问题(运行可能没问题,但写得很不专业),
如果是阻塞的,那么send一定会发送完成才返回(除非出错); 
如果是非阻塞的,那代码倒是对的,即需要判断send是否发送了所有数据;

问题出在do while之上,根据上面说的,如果是阻塞的,显然do while没有用;
如果是非阻塞的,则用法不对,非阻塞放到do while里面之后,就成了阻塞的了(跟阻塞的行为完全一样),
换句话说,你把非阻塞的套节字用成了阻塞的了(那还不如用阻塞的呢,完全没有体现非阻塞的优势)。

这就好比你用udp(不可靠)实现tcp(可靠)一样,你完全可以直接用tcp!