设为首页】 【加入收藏】 【网站地图】 【商品折扣
娱乐一生 娱乐明星
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
首页  |  网络安全  |  业内新闻  |  网络知识  |  组网方案  |  CISCO-思科技术  |  CISCO产品  |  路由技术  |  交换技术  |  网络协议-protocol  |  局域网常识
当前位置:首页 >> FTP协议 >> 用FTP协议编制FTP客户端程序

用FTP协议编制FTP客户端程序 -

FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。

首先我们利用VC++6.0的A Wizard创建一个基于对话框的应用程序,命名为FtpClientDemo。调整主对话框的形式如图1,为程序生成五个基于CAsyncSocket的新类,限于篇幅,只列出主要代码。

 

■CCommandSocket类的主要代码

 

voidCCommandSocket::OnReceive(intnErrorCode)

{

//这个函数使得服务器的应答消息显示在编辑框上

charbuffer=newchar[4096];

memset(buffer,0,4096);

this-〉Receive(buffer,1024,0);

//接收应答消息

Me ageList+=buffer;

m_ReturnMe age-〉SetWindowText(Me ageList);

deletebuffer;

}

 

■CFileSocket类的主要代码

 

voidCFileSocket::OnReceive(intnErrorCode)

{

//函数将收到的文件数据写到文件中

if(File==NULL)

{File=newCFile();

File-〉Open(FileName,CFile::modeWrite|CFile::modeCreate);

}

charbuffer=newchar[4096];

memset(buffer,0,4096);

this-〉Receive(buffer,4096,0);

ReceiveString=buffer;

File-〉Write(ReceiveString,ReceiveString.GetLength());

deletebuffer;

}

 

■CReceiveSocket类的主要代码

 

voidCReceiveSocket::OnReceive(intnErrorCode)

{

//接收服务器传来的文件列表消息

CStringReceiveString,Tem 

charbuffer=newchar[4096];

memset(buffer,0,4096);

this-〉Receive(buffer,4096,0);//接收消息

ReceiveString+=buffer;

deletebuffer;

//将文件列表从收到的消息字符串中分离出来,并显示在列表框中

while(!ReceiveString.IsEmpty())

{intp=ReceiveString.Find("\r\n");

if(p!=-1)

{Temp=ReceiveString.Left(p);

ReceiveString=ReceiveString.Right(ReceiveString.GetLength()-p-2);

Di layMe age-〉AddString(Temp);

}

}

}

 

■CPortSocket类主要代码

 

voidCPortSocket::OnAccept(intnErrorCode)

{

//根据不同的标志选择相应的数据连接类,以接受服务器端的数据连接请求

if(Flag==LISTFILE)

//若程序要求对目录进行列表,则采用CReceiveSocket类

{DataSocket=newCReceiveSocket(FileList);

this-〉Accept(DataSocket);

}

elseif(Flag==DOWNLOAD)

//若程序要求下载文件,则生成CFileSocket类的对象

{FileSocket=newCFileSocket(FileName);

this-〉Accept(FileSocket);

}

}

 

■主对话框类CFtpClient-DemoDlg的主要代码

 

voidCFtpClientDemoDlg::OnFileList()

//响应“文件列表”按钮、列表目录

{CStringTem 

if(ControlSocket==NULL)

{

//连接到FTP服务器

ControlSocket=newCCommandSocket(&am am m_ReturnMe age);

ControlSocket-〉Create();

m_Server.GetWindowText(Temp);

ControlSocket-〉Co ect(Temp,21);

//FTP服务器在21号端口接收连接

}

m_User.GetWindowText(Temp);

Temp="USER"+Temp+"\r\n";

ControlSocket-〉Send(Temp,Temp.GetLength(),0);

//发User命令,验证用户

m_Pa .GetWindowText(Temp);//m_Pa 为“口令”编辑框的对应控制

Temp="PA "+Temp+"\r\n";

ControlSocket-〉Send(Temp,Temp.GetLength(),0);

//发Pa 命令,校验口令

LisentPort(LISTFILE);

//数据连接的对象为目录列表

ControlSocket-〉Send("LIST\r\n",7,0);

//发List命令,要求列表目录

}

voidCFtpClientDemoDlg::OnDownLoad()

//下载文件

{

CStringString;

LisentPort(DOWNLOAD);

//获得要下戴文件的文件名

m_LocalFile.GetWindowText(String);

//m_LocalFile为“文件名”编辑框的对应控制

String="RETR"+String+"\r\n";

ControlSocket-〉Send(String,String.GetLength(),0);

//发RETR命令,下载文件

}

voidCFtpClientDemoDlg::LisentPort(UINTFlag)

{

//根据要求选择不同的数据连接对象

if(LisentSocket!=NULL)

//清空LisentSocket

{LisentSocket-〉Close();

deleteLisentSocket;

LisentSocket=NULL;

}

if(Flag==LISTFILE)

//如果为目录列表数据连接对象

{LisentSocket=newCPortSocket(LISTFILE);

LisentSocket-〉SetListBox(&am am m_FileList);

//传列表框到CLisentSocket类中

}

elseif(Flag==DOWNLOAD)

//如果为文件传输数据连接对象

{CStringString;

m_LocalFile.GetWindowText(String);

LisentSocket=newCPortSocket(DOWNLOAD);

LisentSocket-〉SetFileName(String);

//传文件名到CLisentSocket类中

}

LisentSocket-〉Create();

//建立Socket并进行监听,等待FTP服务器进行数据连接

LisentSocket-〉Listen();

//取得数据连接Socket的IP地址和监听端口,并把它们作为Port命令的参数

SOCKADDR_INlisting_addre ,control_addre 

intaddr_size;

addr_size=sizeof(listing_addre );

LisentSocket-〉GetSockName((SOCKADDR)&am am listing_addre ,&am am addr_size);//取IP地址

ControlSocket-〉GetSockName((SOCKADDR)&am am control_addre ,&am am addr_size);//取端口

u ignedcharport=(u ignedchar)&am am (listing_addre .sin_port);

u ignedcharhost=(u ignedchar)&am am (control_addre .sin_addr);

CStringstrBuffer;

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命令,进行数据连接

}

以上代码在VC++6.0、Windows98上运行通过



 加入收藏 打印本页 关闭窗口 返回顶部
相关文章
· Linux服务器设置指南-代理接入服务器(2)1
· Linux服务器设置指南-代理接入服务器(2)3
· Linux服务器设置指南-代理接入服务器(2)4
· 可以编程的FTP软件:FTP Control
· 用Win 2003 server打造安全的个人Web服务器
· FTP服务中允许上传权限存在的问题
· 如何设置虚拟匿名FTP主机
· ProFTPD和WU-FTP的BANDWIDTH控制
· 自动上传Auto-FT am Mirro
· 用wu-ftpd架设FTP服务器
 

娱乐图摘

更多 >>

靓丽清纯美女meimei

美女私房全裸照
导演劝女演员脱衣服(视频)

大胆火辣人体艺术写真(图)

黑丝妹妹热辣诱惑-丝袜美女妹妹

PLMM 漂亮妹妹图集-妹妹图库

全球美女图库-美女集中营

52MM 我爱漂亮妹妹-制服妹妹诱惑

图王图库-世界美女明星图片资料库
美女写真集锦

激情两性-解密性生活
浴室MM湿身内衣诱惑
邻家小妹洗澡被偷拍(视频)

热点文章

更多

· 什么是FTP及FTP服务器
· ProFTPD和WU-FTP的BANDWIDTH控制
· MS Proxy用法(一)
· 如何以Solaris架设FTP虚拟系统(三)
· Linux服务器设置指南-代理接入服务器(2)1
· 基于UNIX平台FTP服务器的建立 上
· 用FTP协议编制FTP客户端程序
· 站点FTP参数设置
· FTP服务器如何实现安全性
· 用wu-ftpd架设FTP服务器

热点文章

更多