客户端和服务端都使用相同大小的缓冲区8192,服务端使用WSAAsyncSelect模型接收文件(FD_READ)while(1)
{
    ret=recv(...);
    fwrite(...);
    if(ret!=8192)
    {
        fclose(..);
        break;
    }
}
为什么总是接收不到完整的文件?

解决方案 »

  1.   

    流程是不是有点问题?
    while(1)
    {
        ret=recv(...);
        fwrite(...);
        if(ret!=8192)   //写了文件在判断?那你写入多少byte?写的是什么类型的文件?
        {               //一次就一定能够把文件发送完? 建议你思路改改  先发送一个文件头信息 
            fclose(..);        //有很多资料 自己搜一下
            break;
        }
    }
      

  2.   

    1.我写文件时fwrite用了ret作参数,写入ret个byte,我觉得在这里,写文件会不会出错并不是重点;
    2.我打开文件是用二进制,文件类型应该没有关系吧;
    3.正是因为不能一次发送完,所以用了while(1),当缓冲区没有填满时结束;
    4.我知道发送文件头信息的好处,不过在这里我只是想知道这种方法错在哪里。谢谢批评。但我仍不知道错在哪里
      

  3.   

    1. 我觉得你好像对WSAAsyncSelect的理解有点问题,既然客户端和接收端都是8192的缓冲区,
       那接收端为什么还要用while(1)来recv呢? 接收端每次收到 8192 个byte的时候,都会用
       FD_READ消息来通知你,你只用响应消息用一个recv(8192);就可以了,就是说你所要做的
       是响应每一个FD_READ消息来recv,而不是while(1)来recv2. 没有关系3。照你的思路来看,接收端这里当接收完第一次8192字节的时候你就认为文件接收完毕就fclose
       退出了,文件肯定是接收不完全的。4。发送文件头信息只是为了让接收端提前知道文件大小及类型,发不发都无所谓。
      

  4.   

    汗。的确,我真是没有完全理解WSAAsyncSelect,很幼稚。
    谢谢指正。另外,if(ret!=8192)这里是没有错的。