还是关于send返回值的问题
刚刚看过《windows 网络编程技术》,按照上面的说法,当调用send(sock,buf,nMax,0)发送长度为nMax的数据时,可能一次只能拷贝一部分数据len1,其长度len1<nMax,为了将所有的数据都拷贝完成,只能多次调用send发送。当再次调用send(sock,buf,nMax-len1,0)发送剩余的数据时,此时如果send返回socket_error,则说明拷贝失败,关闭套接字,那此时系统缓冲区中只有数据len1,下次我再调用send函数时,怎么才能将剩余的(nMax-len1)发送出去呢?
BOOL MySend(...)
{
int nMax=100
char Buff[nMax];
char *ptr=Buff;
...
...
while(nMax > 0)
{
int nLen = send(sock,ptr,nMax,0);
if(nLen==socket_error)
{
//发送错误
closesocket(sock);
return false;
}
nMax-=nLen;
ptr+= nLen ;
}
return ture;
}
在很多资料中都看到过,为了将数据发送出去,都是像上面那样操作的,可很奇怪,那些例子中都没有介绍过当调用send发送数据,一次没将缓冲区中的数据发送完,而接下来在继续发送剩余的数据时出现错误,该怎么处理剩余的未发送数据。还是这种情况并不会出现?但我想网络连接中断是无法预料的,应该有出现这种情况的可能。那当第二次调用send返回socket_error时,该怎么处理剩余数据?
在前一帖子中我一直以为当多次调用send发送nMax长度的数据过程中,当第一次拷贝一部分数据而第二次失败时,tcp为保证数据的完整性,会将已拷贝的len1长度数据丢弃,现在看来这种理解是错误的。