首先,我建立一个命令控制连接, 接着在线程里发送PASV, TYPE, REST,第一个线程可以下载文件了,
接着第二个线程起动发送PASV 想建立第二个数据连接, 当发送完pasv命令以后,第一个线程的数据连接断掉
了, 这是为什么??
难道不是这样连接的嘛???不然,要怎么连接, ftp服务器上好像设置了这个用户的IP可以连接多个socket  
 
ftp服务器是filezilla软件

解决方案 »

  1.   

    //首先建立命令控制连接
    SOCKET nSocket;
    nSocket = CreateHostSocket("10.102.12.213", 21);


    //send tfp command
    CString strReturnCode="", strReturnContent="";
    strReturnContent = SendCommand(nSocket, "USER", "zhengzh");
    strReturnCode = GetReturnCode(strReturnContent);
    if("220" != strReturnCode)
    {
    //登陆FTP的用户名,执行成功返回220
    return;
    }

    strReturnContent = SendCommand(nSocket, "PASS", "123456");
    strReturnCode = GetReturnCode(strReturnContent);
    if("230" != strReturnCode)
    {
    //密码,执行成功返回230
    return;
    } //登录成功
    //获得文件大小
    strReturnContent = SendCommand(nSocket, "SIZE", "20071207.jrn");
    strReturnCode = GetReturnCode(strReturnContent);
    if("213" != strReturnCode)
    {
    //文件大小,执行成功返回213
    return;
    }
    //取文件大小
    long lFileSize = atoi(strReturnContent.Right(strReturnContent.GetLength() - 4));//起两线程//线程函数
    UINT Download(LPVOID lParam)
    {
    FileInfo *pFile = (FileInfo *)lParam; SOCKET nSocket = pFile->socketCommand;
    CString downloadFileName = pFile->downloadFileName;
    CString saveFileName = pFile->saveFileName;
    CString failFileName = pFile->failFileLog;
    CString ip = pFile->ip;
        DWORD from = pFile->from;
        DWORD to = pFile->to;


    CString strReturnCode="", strReturnContent="";

    //当第一个线程正在下载的时候, 第二线程到这里发了这个命令以后,第一线程就断掉了
    //send PASV
    strReturnContent = SendCommand(nSocket,"PASV", "");
    strReturnCode = GetReturnCode(strReturnContent);
    if("227" != strReturnCode)
    {
    //文件大小,执行成功返回213
    return 0;
    } //解析IP地址和端口
    IPAddress ipData;
    ipData = GetIpAndPort(strReturnContent);

    SOCKET nFileSocket;
    nFileSocket = CreateHostSocket(ipData.strIP, ipData.uPort); //send TYPE
    strReturnContent = SendCommand(nSocket,"TYPE", "A");
    strReturnCode = GetReturnCode(strReturnContent);
    if("200" != strReturnCode)
    {
    //指定下载文件的类型, 执行成功返回200
    return 0;
    } //send REST  
    strReturnContent = SendCommand(nSocket,"REST", from);
    strReturnCode = GetReturnCode(strReturnContent);
    if("350" != strReturnCode)
    {
    //指定文件下载的开始位置,执行成功返回350
    return 0;
    }
    //send RETR  
    strReturnContent = SendCommand(nSocket,"RETR", downloadFileName);
    strReturnCode = GetReturnCode(strReturnContent);
    if("150" != strReturnCode)
    {
    //下载文件,执行成功返回150
    return 0;
    }
    //...............
    }
      

  2.   

    老娘的, CSDN真TMD没能人啊, 这么点小问题都没人给我解决掉啊
      

  3.   

    FileZilla的源代码我都看过, 也研究过一些时间, 建议你先研究透了再说.CSDN肯定有能人的, 慢慢等, 应该会有人帮你解决掉的.
      

  4.   

    多个数据通道使用同一个控制通道?????? 
    不断才怪
    ==========================
    是的,就是这个原因,虽然你的服务器接受多个socket,但是客户端在同一个socket上你要建立两个连接那是不行的.
      

  5.   

    自己不懂还这么狂
    我写过FTP SERVER
    本来我可以告诉你,
    但是看了你另外一个帖子
    你自己去读RFC959协议吧
      

  6.   

    试试换个ftp服务器,有些服务器是限制同ip连接数的。
      

  7.   

    哪个有FileZilla的源代码嘛? 发一份给我看看[email protected]
    谢谢
      

  8.   

    哎,你那个socket一直在用着传文件数据,你还用他发送命令,别人服务器怎么给你回啊?肯定是断开了再给你回呗。多线程的下载肯定是重新来一套那第一个线程的那些东西啊~