socket中收发的代码,请帮忙解释一下!解决办法

socket中收发的代码,请帮忙解释一下!
C/C++ code

int CRE_Socket::send_SVR(char * data, int size)
{
    if (m_sockconn != SOCKET_ERROR)
    {
        int nLeft, nWritten;
        nLeft = size;
        char *dataTemp = data;
        while (nLeft > 0)
        {
                           //循环中,如果send发送的字节数不是定义的长度,
            nWritten = send(m_sockconn,dataTemp, nLeft, 0);
            if (nWritten == SOCKET_ERROR)
                return nWritten;
                           //那么让nLeft减去实际发送的长度
            nLeft -= nWritten;
                           //并且指向数据的指针也往后移动到了实际发送长度后。
            dataTemp += nWritten;
                           //我想问的是,如果实际发送长度不等于定义长度,直接就
//重发呗,为啥还要从数据的中间再发送(dataTemp += nWritten;)?
//下面的recv也是同问,如果接收的数据包不够指定长度那就丢弃不处理,并要求服务器重发呗,为啥还要循环读取?
//我是新手,请老手详细讲讲!谢谢啊!!
        }

        return size - nLeft;
    }
    else
    {
        return SOCKET_ERROR;
    }
}


int CRE_Socket::recv_SVR(char * data, int size)
{
    if (m_sockconn != SOCKET_ERROR)
    {
        int nLeft, nWritten;
        nLeft = size;
        char *dataTemp = data;
        while (nLeft > 0)
        {
            nWritten = recv(m_sockconn,dataTemp,nLeft,0);
            if (nWritten == SOCKET_ERROR)
                return nWritten;
            nLeft -= nWritten;
            dataTemp += nWritten;
        }
        return size - nLeft;
    }
    else
    {
        return SOCKET_ERROR;
    }
}



------解决方案--------------------
你要发10个字节,在实际网路中,可能分若干次,每次若干字节发送,这个不受你控制
接收也是,可能一次,可能10次,每次收1个字节,也不受你控制,

你能控制的(tcp):
你先send的数据,那边一定先recv,顺序相同
你send的字节数最终和recv的总字节数相同
recv成功后,做为send一方你是知道的,但这个时间不确定
网络断开后,winsock不一定会通知你,

ps:如果是异步,你发的函数都要加上10035的判断


------解决方案--------------------
探讨

引用:
再重头发的话效率不是很低吗,先发一部分,如果有剩下的,就接着发剩下的。接收端也是类似

有没有这种可能,
比如我规定长度是10,现在send的实际长度是5,但是recv的实际长度是3,有没有这种可能?
如果有该怎么办啊?

按照代码的流程,实际发5,那么下次发送的是剩下的5,而recv接收的是3,包组合的时候就会把本来是4的位置放成……