我在写一个ftp客户端
下载文件函数中
发送RETR给服务器后
用服务器返回的IP地址和端口建立CSocket并且循环调用Receive()接受数据
但是发现有时候文件还没有全部传完,Receive()就收不到数据了,怎么回事?         CSocket mSocket;
if (mSocket.Create())
{
mSocket.Connect(strIPAdress, nPort);
CFile dataStore;
if (dataStore.Open(NewFile, CFile::modeCreate
|CFile::modeNoTruncate
|CFile::modeWrite
|CFile::typeBinary
|CFile::shareDenyWrite))
{
if (seek != 0)
dataStore.Seek(seek, CFile::begin); UINT mCount = 2048;
UINT mTransferred = mCount;
while (mCount == mTransferred)
{
char* buf = new char[2048];
memset(buf, 0, 2048);
mTransferred = mSocket.Receive(buf, mCount); dataStore.Write(buf, mTransferred);
delete[] buf;
}
dataStore.Close();
}
mSocket.Close();

解决方案 »

  1.   

    WSAGetLastError,连接异常断开就收不了完啦
      

  2.   

    在传输中断的地方Get到的Error是10057,msdn上说明是
    WSAENOTCONN 
    (10057) 
    Socket is not connected. 
    A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset. 难道是连接断了?
    我连本地的FTP都会断的么-。-而且似乎第一次下载文件时不会有问题,下载第二个开始就失败鸟-。-
      

  3.   

    while (mCount == mTransferred) 

    char* buf = new char[2048]; 
    memset(buf, 0, 2048); 
    mTransferred = mSocket.Receive(buf, mCount); dataStore.Write(buf, mTransferred); 
    delete[] buf; 

    这个地方写的有问题吧?
      

  4.   

    链接时间过长或长时间没有活动服务器可以将该链接断开回收资源。
    看看rfc对ftp描述就知道了
      

  5.   

       如果是c/s模式的话就加个较验吧.Server端要给你发送数据之前先通知Client端.到底要发多大数据.Client端就做好准备工作接收.判断每次接收到的数据大小.如果小于Server端通知的大小就说明未发送完全.在Server端发送的时候也要检查自身socket数据的完整性以及可读可写性.避免出现一些网络粘包的问题.还有发送数据的时候尽可能的小一些.别太大了.大了在网络环境很复杂的情况下根本接收不到任何数据的.就简单说电信跟网通的通信状况.反正大致就是这样.除非socket断掉.否则数据传输不会出错的.
      

  6.   

    while (mCount == mTransferred) 

    char* buf = new char[2048]; 
    memset(buf, 0, 2048); 
    mTransferred = mSocket.Receive(buf, mCount); dataStore.Write(buf, mTransferred); 
    delete[] buf; 

    有问题,应该这么写:
    char* buf = new char[2048];
    if ( NULL == buf)
    {
        ....
    }do
    {
      ::ZeroMemory(buf);
       mTransferred = mSocket.Receive(buf,mCount);
       dataStor.Write(buf, mTransferred);
    }
    while(mCount == mTransferred);