08011302计网第二次实验.docx
《08011302计网第二次实验.docx》由会员分享,可在线阅读,更多相关《08011302计网第二次实验.docx(22页珍藏版)》请在冰豆网上搜索。
![08011302计网第二次实验.docx](https://file1.bdocx.com/fileroot1/2023-1/27/6cbd827d-01f0-446e-adf7-1a16aec291a2/6cbd827d-01f0-446e-adf7-1a16aec291a21.gif)
08011302计网第二次实验
东南大学自动化学院
实验报告
课程名称:
信息通信网络概论
第2次实验
实验名称:
FTP客户端通信程序设计
院(系):
自动化专业:
自动化
姓名:
刘燊燊学号:
********
实验室:
金智楼五楼一号机房实验组别:
同组人员:
实验时间:
2013年12月9日
评定成绩:
审阅教师:
一.实验目的和要求………………………………………………3
二.实验原理………………………………………………………3-4
三.实验方案与实验步骤…………………………………………4-5
四.实验设备与器材配置…………………………………………5
五.实验记录………………………………………………………5-21
六.实验总结………………………………………………………21
七.思考题或讨论题………………………………………………21-22
实验二FTP客户端通信程序设计
一.实验目的和要求
1.了解Windows下的TCP/IP通信方式与网络操作
2.熟悉FTP的编程的过程;
3.学会用可视化编程语言编写调试简单的通信程序。
二.实验原理
在使用MFC编程时,要连接到FTP服务器是一件非常简单的事情,只需要两个简单的步骤,首先必须建立一个CinternetSession对象,用类CinternetSession创建并初始化一个或几个同时存在的Internet会话(Session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的廉洁,可以创建一个CinternetSession对象作为类CwinApp的成员。
MFC中的类CftpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP时MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CinternetSession实例和一个CftpConnection对象就可以实现和一个FTP服务器通信,我们不需要直接创建CftpConnection对象,而是通过调用CinternetSession:
:
GetFtpConnection来完成这项工作。
他创建CFtpConnection对象并返回一个指向该对象的指针。
在FTP连接的程序中,主要适用下列7个函数:
1)CInternetSession对象
语法:
CInternetSession(LPCTSTRpstrAgent,DWORDdwConText,DWORDdwAccessType,LPCTSTRpstrProxyName,LPCTSTRpstrProxyBypass,DWORDdwFlags);
注释:
在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。
如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。
如果沒有打开Internet连接,CInternetSession就会抛出一个例外,fxThorowInternetException。
2)GetFtpConnection()函数。
语法:
CFtpConnection*CIternetSession:
:
GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName,LPCTSTRpstrPassword,INTERNET_PORTnPort,BOOLbPassive);
注释:
调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。
如果打算读写文件,必须进行分步操作。
关于查找,打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。
对这个函数的调用返回一个指向CFtpConnection对象的指针。
如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。
3)GetFile()函数。
语法:
BOOLGetFile(LPCTSTRpstrRemoteFile,LPCTSTRpstrLocalFile,BOOLbFailExists,DWORDdwAttributes,DWORDdwFlags,DWORDdwContext);
注释:
调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。
GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,以及把文件存放在本地机器上的工作。
如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等阶符号。
默认的传输模式是二进制模式,文件会以和服务器上相同的格式被下载。
pstrRemoteFile和pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用反斜杠(\)或者正斜杠(/)来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。
可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CFtpConnection对象的定位操作有关,这个操作由CFtpConnection中的CInternetSession对象创建。
返回给CInternetSession:
:
OnStatusCallBack的值指出了所标识操作的状态。
如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。
4)PutFile()函数。
语法:
BOOLPutFile(LPCTSTRpstrLocalFile,LPCTSTRpstrRemoveFile,DWORDdwFlags,DWORDdwContext);
注释:
调用这个成员函数可以把文件保存到FTP服务器。
PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。
只发送数据,或要严格控制文件传输的应用程序,应该调用OpenFile和CInternet:
:
Write。
利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession:
:
OnStateCallBack,从而把操作的状态通报给它所标识的上下文。
如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。
5)FTP文件查找函数。
调用这个成员函数构造一个CftpFileFind对象。
6)FindFile()函数。
调用这个函数查找FTP文件,调用它检索到第一个FTP文件后,可以调用FindNextFile()检索后面的FTP文件。
7)FindNextFile()函数。
调用这个函数继续查找文件,在调用任何属性以前,必须已经至少调用过一次此函数。
以上函数的具体使用方法可以参见MSDN。
三.实验方案与实验步骤
1、创建一个internet会话。
CInternetSession*pSession;
pSession=newCInternetSession(AfxGetAppName(),1,
PRE_CONFIG_INTERNET_ACCESS);
2、建立与FTP服务器的连接。
CFtpConnection*pConnection;
pConnection=pSession->GetFtpConnection(m_strFtpSite,
m_strName,m_strPwd);
3、如果连接成功,获得当前登陆的缺省目录下所有的文件和目录名称。
CFtpFileFind*pFileFind;
pFileFind=newCFtpFileFind(pConnection);
Find()
4、下载文件或上传文件。
OnDownload()
OnUpload()
5、关闭连接。
四.实验设备与器材配置
实验室具有基于TCP/IP协议的Windows网络硬软件环境;
五.实验记录
主要部分代码记录:
//08011302Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"08011302.h"
#include"afxinet.h"
#include"08011302Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy08011302Dlgdialog
CMy08011302Dlg:
:
CMy08011302Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMy08011302Dlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMy08011302Dlg)
m_strFtpSite=_T("");
m_strName=_T("");
m_strPwd=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMy08011302Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy08011302Dlg)
DDX_Control(pDX,IDC_LIST_FILE,m_ListFile);
DDX_Control(pDX,IDC_EDIT_PWD,m_EditPwd);
DDX_Control(pDX,IDC_EDIT_NAME,m_EditName);
DDX_Control(pDX,IDC_EDIT_FTP,m_EditFtp);
DDX_Control(pDX,IDC_DOWNLOAD,m_BtnDownLoad);
DDX_Control(pDX,IDOK,m_BtnConnect);
DDX_Control(pDX,IDCANCEL,m_cancel);
DDX_Control(pDX,IDC_UPLOAD,m_BtnUpLoad);
DDX_Control(pDX,IDC_STATIC_PWD,m_StaPwd);
DDX_Control(pDX,IDC_STATIC_NAME,m_StaName);
DDX_Control(pDX,IDC_STATIC_FTP,m_StaFtp);
DDX_Text(pDX,IDC_EDIT_FTP,m_strFtpSite);
DDX_Text(pDX,IDC_EDIT_NAME,m_strName);
DDX_Text(pDX,IDC_EDIT_PWD,m_strPwd);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMy08011302Dlg,CDialog)
//{{AFX_MSG_MAP(CMy08011302Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK,OnConnect)
ON_BN_CLICKED(IDC_UPLOAD,OnUpload)
ON_BN_CLICKED(IDC_DOWNLOAD,OnDownload)
ON_EN_CHANGE(IDC_EDIT_FTP,OnChangeEditFtp)
ON_EN_CHANGE(IDC_EDIT_NAME,OnChangeEditName)
ON_EN_CHANGE(IDC_EDIT_PWD,OnChangeEditPwd)
ON_LBN_SELCHANGE(IDC_LIST_FILE,OnSelchangeListFile)
ON_LBN_DBLCLK(IDC_LIST_FILE,OnDblclkListFile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy08011302Dlgmessagehandlers
BOOLCMy08011302Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//域名初始化
m_strFtpSite=_T("10.1.51.108");
//登陆名初始化
m_strName=_T("JSNet2013");
//口令初始化
m_strPwd=_T("");
//更新界面
UpdateData(FALSE);
//禁用下载和上传按钮
m_BtnDownLoad.EnableWindow(FALSE);
m_BtnUpLoad.EnableWindow(FALSE);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMy08011302Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMy08011302Dlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMy08011302Dlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMy08011302Dlg:
:
OnConnect()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrConnect;
m_BtnConnect.GetWindowText(strConnect);
//获得当前输入
UpdateData(TRUE);
//判断ftp地址栏是否为空
if(m_strFtpSite.IsEmpty())
{
MessageBox("请输入ftp服务器地址!
");
return;
}
//清除列表框内容
while(m_ListFile.GetCount()!
=0)
{
m_ListFile.DeleteString(0);
}
//TRACE("strConnect:
%s",strConnect);
//AfxMessageBox(strConnect);
if(strConnect=="连接")
{
//创建Internet会话
pSession=newCInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
try{
//试图建立FTP连接
pConnection=pSession->GetFtpConnection(m_strFtpSite,m_strName,m_strPwd);
}
catch(CInternetException*e)
{
//错误处理
e->Delete();
pConnection=NULL;
AfxMessageBox("连接错误,请检查地址和用户名密码");
return;
}
if(pConnection!
=NULL)
{
//创建CFtpFileFind对象
//传递CFtpConnection对象的指针
pFileFind=newCFtpFileFind(pConnection);
m_BtnUpLoad.EnableWindow(TRUE);
}