谁能给我一段用winsock api进行ftp文件下载的源代码??100分!!
解决方案 »
- opengl+3ds+贴图问题
- 请问如何用CTreeCtrl实现浏览局域网所有共享文件夹功能?
- 求Winsock 2网络编程实用教程的随书光盘
- 100分求孝有关 eps 文件的信息???????????????
- 如何获得我所连接SQL SERVER实例的IP地址??
- 在控件中引用CEdit控件出现的奇怪问题:不能使用方向键和BackSpace键
- UpdateData()与UpDate(),有什么区别呢?
- 如何改变静态文本框和按钮控件的字体?
- 有没有这样的算法?关于振型分解的!或者是摸态分析的?谢谢!毕业设计用
- 通过api函数,可以得到区域设置吗?比如我想知道本机操作系统设置的是US还是China?
- ★菜鸟请教关于多文档窗口???
- Dialog无法添加新的事件?
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);
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); } charbuffer=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; charbuffer=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命令,进行数据连接 }
http://www.csdn.net/develop/Read_Article.asp?Id=6152
; 打开 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
{
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上开发、编译、运行通过。
[email protected]