上面的排版有些问题,请看这里:
msdn中说:对于非阻塞的套介子,send(...)返回
  1.SOCKET_ERROR:发生错误,如果网络没有问题,通常为缓冲区满.
  2.int 类型的正数 返回值有可能不发送的字节数小.
据此:我想用非阻塞套介子casyncsocket发送文件onsend中的代码如下.
发送一个22M的文件时,在发送15M左右,程序变为没有响应.菜鸟实在不知
原因如何,请高手指点:
CFile file;//要发送的文件
file.Open("d:/testsend/testsrc",CFile::modeRead¦CFile::shareDenyNone);//打开文件
int sendlen;//每次从文件中读出的长度,只在结尾时才不等于1000
char buffer[1000];
int sended=0;//buffer 中已经发送的字节数
while((sendlen=file.Read(buffer,1000))>0){
    int ret;
    while(1) {
            ret=Send(buffer+sended,sendlen);
            if (ret==SOCKET_ERROR){//如果返回SOCKET_ERROR重新发送
                Sleep(10);continue;
            }
            if(ret==sendlen)break;//如果发送完全,跳出
            sended+=ret;          //已发送字节数增加ret
            sendlen-=ret;        //剩余字节数减少ret
    }
}

解决方案 »

  1.   

    int sended=0;//buffer 中已经发送的字节数
    while((sendlen=file.Read(buffer,1000))>0){
        int ret, sent;
        sent = 0;
        while(1) {
                /*sended的值通常会超过1000的,除非你的文件小于1k。*/
                ret=Send(buffer+sent,sendlen);
                if (ret==SOCKET_ERROR){//如果返回SOCKET_ERROR重新发送
                    ASSERT(  WSAEWOULDBLOCK == WSAGetLastError() );
                    /*如果出现ASSERT错误请检查WSAGetLastError()的值*/
                    Sleep(10);continue;
                }
                if(ret==sendlen)break;//如果发送完全,跳出
                sended+=ret;          //已发送字节数增加ret
                sent += ret;
                sendlen-=ret;        //剩余字节数减少ret
        }
    }
      

  2.   

    在语句ret=Send(buffer+sent,sendlen)后加上这么一段调试代码再试试看,
    long err=GetLastError();
    TRACE("ERROR=%d",err);
    当err的值不为0时,检查一下出错值,并查明原因,同时,Sleep()语句的时间可以再长一点。
      

  3.   

    jizy,谢谢你帮我解了围。我用win98测试后给你加分
    关于socket通信,服务端的程序,希望大家能列举用过的模型,并进行讨论。