谁能给我一段用winsock api进行ftp文件下载的源代码??100分!!

解决方案 »

  1.   

    CInternetSession * pInter = new CInternetSession;
    CFtpConnection * pFtp; TRY
    {
    pFtp = pInter->GetFtpConnection(ServerName);
    }
    CATCH(CInternetException, e)
    {
    return FALSE;
    }END_CATCH SourceFiles.Format("%s/%s", FolderName, UpgradeFile);
    nReturn = pFtp->GetFile(SourceFiles, 
    UpgradeFile, FALSE, FILE_ATTRIBUTE_NORMAL, 
    FTP_TRANSFER_TYPE_BINARY, 1);
      

  2.   

    用VC++编制FTP客户端应用程序
      FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。   首先我们利用VC++ 6.0的AppWizard创建一个基于对话框的应用程序,命名为FtpClientDemo。为程序生成五个基于CAsyncSocket的新类,这里列出主要代码。   CCommandSocket类的主要代码   void CCommandSocket::OnReceive(int nErrorCode)   {   //这个函数使得服务器的应答消息显示在编辑框上    char buffer=new char[4096];    memset(buffer,0,4096);    this-〉Receive(buffer,1024,0);   //接收应答消息    MessageList+=buffer;    m_ReturnMessage-〉SetWindowText(MessageList);    delete buffer;   }   CFileSocket类的主要代码     void CFileSocket::OnReceive(int nErrorCode)   {   //函数将收到的文件数据写到文件中    if(File= =NULL)    { File=new CFile();    File-〉Open(FileName,CFile::modeWrite|CFile::modeCreate);    }    charbuffer=new char[4096];    memset(buffer,0,4096);    this-〉Receive(buffer,4096,0);    ReceiveString=buffer;    File-〉Write(ReceiveString,ReceiveString.GetLength( ));    delete buffer;   }   CReceiveSocket类的主要代码   void CReceiveSocket::OnReceive(int nErrorCode)   {   //接收服务器传来的文件列表消息    CString ReceiveString,Temp;    charbuffer=new char[4096];    memset(buffer,0,4096);    this-〉Receive(buffer,4096,0); //接收消息    ReceiveString+=buffer;    delete buffer;   //将文件列表从收到的消息字符串中分离出来,并显示在列表框中    while(!ReceiveString.IsEmpty())    { int p=ReceiveString.Find("\r\n");   if(p!=-1)   { Temp=ReceiveString.Left(p);    ReceiveString=ReceiveString.Right(ReceiveString.GetLength()-p-2);   DisplayMessage-〉AddString(Temp);    }   }   }   CPortSocket类主要代码   void CPortSocket::OnAccept(int nErrorCode)   {   //根据不同的标志选择相应的数据连接类,以接受服务器端的数据连接请求    if(Flag= =LISTFILE)   //若程序要求对目录进行列表,则采用CReceiveSocket类    {DataSocket=new CReceiveSocket(FileList);    this-〉Accept(DataSocket);    }    else if(Flag= =DOWNLOAD)   //若程序要求下载文件,则生成CFileSocket类的对象   {FileSocket=new CFileSocket(FileName);   this-〉Accept(FileSocket);    }   }   主对话框类CFtpClient- DemoDlg的主要代码     void CFtpClientDemoDlg::OnFileList()   //响应“文件列表”按钮、列表目录   { CString Temp;    if(ControlSocket= =NULL)    {   //连接到FTP服务器   ControlSocket=new CCommandSocket(&&m_ReturnMessage);   ControlSocket-〉Create();   m_Server.GetWindowText(Temp);   ControlSocket-〉Connect(Temp,21);   //FTP服务器在21号端口接收连接    }    m_User.GetWindowText(Temp);    Temp="USER "+Temp+"\r\n";    ControlSocket-〉Send(Temp,Temp.GetLength(),0);   //发User命令,验证用户    m_Pass.GetWindowText(Temp); //m_Pass为“口令”编辑框的对应控制    Temp="PASS "+Temp+"\r\n";    ControlSocket-〉Send(Temp,Temp.GetLength(),0);   //发Pass命令,校验口令    LisentPort(LISTFILE);   //数据连接的对象为目录列表    ControlSocket-〉Send("LIST \r\n",7 ,0);   //发List命令,要求列表目录   }   void CFtpClientDemoDlg::OnDownLoad( )   //下载文件   {    CString String;    LisentPort(DOWNLOAD);   //获得要下戴文件的文件名    m_LocalFile.GetWindowText(String);   // m_LocalFile为“文件名”编辑框的对应控制    String="RETR "+String+"\r\n";    ControlSocket-〉Send(String,String.GetLength( ),0);   //发RETR命令,下载文件   }   void CFtpClientDemoDlg::LisentPort(UINT Flag)   {   //根据要求选择不同的数据连接对象    if(LisentSocket!=NULL)   //清空LisentSocket    { LisentSocket-〉Close();    delete LisentSocket;    LisentSocket=NULL;    }    if(Flag= =LISTFILE)   //如果为目录列表数据连接对象    { LisentSocket=new CPortSocket(LISTFILE);    LisentSocket-〉SetListBox(&&m_FileList);   //传列表框到CLisentSocket类中    }    else if(Flag= =DOWNLOAD)   //如果为文件传输数据连接对象    { CString String;    m_LocalFile.GetWindowText(String);    LisentSocket=new CPortSocket(DOWNLOAD);    LisentSocket-〉SetFileName(String);   //传文件名到CLisentSocket类中    }    LisentSocket-〉Create();   //建立Socket并进行监听,等待FTP服务器进行数据连接    LisentSocket-〉Listen();   //取得数据连接Socket的IP地址和监听端口,并把它们作为Port命令的参数    SOCKADDR_IN listing_address, control_address;    int addr_size;    addr_size = sizeof(listing_address);    LisentSocket-〉GetSockName((SOCKADDR )&&listing_address, &&addr_size); //
    取IP地址    ControlSocket-〉GetSockName((SOCKADDR )&&control_address, &&addr_size); /
    /取端口   unsigned char port = (unsigned char )&&(listing_address.sin_port);    unsigned char host = (unsigned char )&&(control_address.sin_addr);    CString strBuffer;    strBuffer.Format("PORT %i,%i,%i,%i,%i,%i\r\n",(int)host[0], (int)host[1], (
    int)host[2], (int)host[3],(int)port[0], (int)port[1]);    ControlSocket-〉Send(strBuffer,strBuffer.GetLength(),0);   //发送Port命令,进行数据连接   } 
      

  3.   

    用VC++编制FTP客户端应用程序
    http://www.csdn.net/develop/Read_Article.asp?Id=6152
      

  4.   

    ;********************************************************************
    ; 打开 URL
    ;********************************************************************
    invoke _ShowInfo,addr szConnecting
    invoke InternetOpenUrl,@hSession,addr szUrl,NULL,0,INTERNET_FLAG_NO_AUTO_REDIRECT,0
    .if ! eax
    mov ebx,offset szConnError
    jmp _DL_Err
    .endif
    mov @hHttpFile,eax
    ;********************************************************************
    ; 检测文件长度以及文件是否存在
    ;********************************************************************
    mov @dwRead,sizeof szBuffer
    invoke HttpQueryInfo,@hHttpFile,HTTP_QUERY_STATUS_CODE,\
    addr szBuffer,addr @dwRead,NULL
    .if ! eax
    mov ebx,offset szReadError
    jmp _DL_Err1
    .endif
    invoke lstrcmp,addr szBuffer,addr szStateOK
    .if eax
    mov ebx,offset szNoFile
    jmp _DL_Err1
    .endif
    invoke HttpQueryInfo,@hHttpFile,HTTP_QUERY_CONTENT_LENGTH,\
    addr szBuffer,addr @dwRead,NULL
    .if eax
    invoke _GetStringValue,addr szBuffer,10
    mov @dwTotalByte,eax
    .endif
    ;********************************************************************
    ; 建立存盘文件
    ;********************************************************************
    invoke _GetSaveFile,addr @szBuffer,sizeof @szBuffer
    .if ! eax
    mov ebx,offset szAbort
    jmp _DL_Err1
    .endif
    invoke CreateFile,addr @szBuffer,GENERIC_READ or GENERIC_WRITE,\
    FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    .if eax == INVALID_HANDLE_VALUE
    mov ebx,offset szWriteError
    jmp _DL_Err1
    .endif
    mov @hSaveFile,eax
    mov @dwNowReadByte,0
    ;********************************************************************
    ; 接收数据并存盘
    ;********************************************************************
    invoke SetDlgItemText,hWinMain,IDOK,addr szStop
    invoke GetDlgItem,hWinMain,IDOK
    invoke EnableWindow,eax,TRUE
    .repeat
    .if dwFlag & F_ABORT
    mov ebx,offset szAbort
    jmp _DL_Err2
    .endif
    invoke InternetReadFile,@hHttpFile,addr szBuffer,sizeof szBuffer,addr @dwRead
    .if eax
    .break .if @dwRead == 0
    invoke WriteFile,@hSaveFile,addr szBuffer,@dwRead,\
    addr @dwWrite,NULL
    mov eax,@dwRead
    add @dwNowReadByte,eax
    xor eax,eax
    .if @dwTotalByte
    mov eax,@dwNowReadByte
    mov ecx,100
    mul ecx
    div @dwTotalByte
    .endif
    invoke wsprintf,addr szBuffer,addr szFormat,@dwNowReadByte,eax
    invoke _ShowInfo,addr szBuffer
    .else
    invoke SetDlgItemText,hWinMain,IDC_INFO,addr szReadError
    .break
    .endif
    .until 0
    mov ebx,offset szFinish
    _DL_Err2:
    invoke CloseHandle,@hSaveFile
    _DL_Err1:
    invoke InternetCloseHandle,@hHttpFile
    _DL_Err:
    invoke InternetCloseHandle,@hSession
    _DL_Ret:
    .if ebx
    invoke _ShowInfo,ebx
    .endif
    invoke SetDlgItemText,hWinMain,IDOK,addr szStart
    invoke GetDlgItem,hWinMain,IDOK
    invoke EnableWindow,eax,TRUE
    invoke GetDlgItem,hWinMain,IDC_URL
    invoke EnableWindow,eax,TRUE
    invoke CloseHandle,hThread
    mov hThread,0 popad
    ret_DownLoad endp
      

  5.   

    在VC++中创建一个基于对话框的应用程序,需要注意的是在创建此工程时,一定要选择Windows Sockets这一选项。创建的对话框的结构如上图,并在对话框类的文件中加入#include 'afxinet.h' 头文件。然后在对话框这个类的文件中加入下列函数,此函数是敲击Send-Button按钮发生的事件,主要是完成FTP功能传送文件的功能,本程序中要传的文件应该放在本工程中,如果放在别处可稍加改动一下即可。     void CFtptestDlg::OnSendButton() 
        {
        CString host;
        m_HostEdit.GetWindowText(host);
        //m_HostEdit是对话框中FTP Host :Edit控件的命名
        CString user;
        
        m_UserEdit.GetWindowText(user);
        //m_UserEdit是对话框中User:Edit控件的命名
        CString password;
        m_PasswordEdit.GetWindowText(password);
        //m_PasswordEdit是对话框中Password:Edit控件的命名
        CString filename;
        m_FileEdit.GetWindowText(filename);
        //m_FileEdit是对话中SendFile:Edit控件的命名
        TRACE(':%s:%s:%s:%s\n', host, 
        user, password, filename);
        CInternetSession session
        (AfxGetApp()- >m_pszAppName);
        CFtpConnection* pConn = NULL;
        pConn = session.GetFtpConnection
        (host,user,password);
        if (pConn) {
        if (!pConn- >PutFile(filename,filename)){
        MessageBox('传送文件失败??');
        } else {
        MessageBox('传送文件成功!');
        }
        pConn- >Close();
        delete pConn;
        session.Close();
        } else {
        MessageBox('Cannot Connect');
        }
        }
        这个应用程序使用中文95操作系统,在VC++5.0上开发、编译、运行通过。
      

  6.   

    人家要用socket api写一个,和我联系吧,我有代码。
      

  7.   

    有的话给我一份让我也学学
    [email protected]