武汉大学计算机学院课程实验(设计)报告课程名称:计算机网络应用设计专业、班:姓名:学号:学期:2010年上学期1第二部分软件设计一、实验内容完成FTP客户端、POP3客户端两个系统程序,以及一个应用程序。客户端操作系统为WindowsXP。FTP程序要求具有图形化界面、上传、下载功能,鼓励实现断点续传功能,POP3程序具有邮件接收、阅读、删除等基本功能。FTP、POP3程序使用socket方式编程,从创建socket、建立TCP连接开始,实现FTP、SMTP、POP3协议的功能,不得调用第三方控件(可使用操作系统自身的API函数)。编程工具可以使用C#或VC++。应用程序要求实现一个网上书店的基本功能,要求具有前端(用户)和后端(管理)功能,基于Web运行方式。前端具有浏览书目、购物车等功能,后端具有管理书目、基本统计功能。编程工具可以是MS.NET(C#)或者J2EE二选一,数据库可以是SQLServer、DB2、Oracle、Mysql、PostgreSQL之一。二、实验步骤与实验结果1.FTP源程序说明:本程序使用VC++编写,开发环境为VS2008/******************************************************************************//连接FTP服务器******************************************************************************/voidCmfcftp3Dlg::OnBnClickedButton1(){m_pInetSession=newCInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);UpdateData(TRUE);try{//根据给出的参数连接到FTP服务器m_pFtpConnection=m_pInetSession-GetFtpConnection(m_host,m_username,m_password,m_port);if(m_pFtpConnection!=NULL){CStringm_i;2m_i=连接成功\r\n;m_ftpinfo+=m_i;UpdateData(FALSE);List();}}catch(CInternetException*pEx){CStringm_i;m_i=连接no成功\r\n;m_ftpinfo+=m_i;UpdateData(FALSE);TCHARszError[1024];if(pEx-GetErrorMessage(szError,1024)){m_i=(CString)szError;m_ftpinfo+=m_i;UpdateData(FALSE);}elseAfxMessageBox(Therewasanexception);pEx-Delete();m_pFtpConnection=NULL;}}/*********************************************************************//列出FTP服务器上的所有文件****************************************************************************/voidCmfcftp3Dlg::List(){CStringm_i;CStringm_ii;CStringArraym_Dir;CFtpFileFindfinder(m_pFtpConnection);BOOLbWorking=finder.FindFile(_T(*));while(bWorking)3{bWorking=finder.FindNextFile();if(finder.IsDots())continue;if(finder.IsDirectory())//如果是目录。{m_Dir.Add(finder.GetFileName());}else{m_i=finder.GetFileName()+\r\n;for(intj=0;jn;j++){m_ii=\t;m_ftpinfo=m_ftpinfo+m_ii;}m_ftpinfo+=m_i;UpdateData(FALSE);}}finder.Close();for(inti=0;im_Dir.GetSize();i++){n++;m_i=[+m_Dir.GetAt(i)+]+\r\n;for(intj=1;jn;j++){m_ii=\t;m_ftpinfo=m_ftpinfo+m_ii;}m_ftpinfo+=m_i;UpdateData(FALSE);BOOLm_suc=0;while(!m_suc){m_suc=m_pFtpConnection-SetCurrentDirectory(m_Dir.GetAt(i));4}List();BOOLm_suc1=0;while(!m_suc1){m_suc1=m_pFtpConnection-SetCurrentDirectory(..);}n--;}}2.POP3源程序说明:本程序是使用VC++编写,开发环境为VS2008,这里只贴了与实现相关的代码,界面部分的代码不在此描述了。MyPop3App.cpp文件:BOOLCMyPop3App::InitInstance(){INITCOMMONCONTROLSEXInitCtrls;InitCtrls.dwSize=sizeof(InitCtrls);//将它设置为包括所有要在应用程序中使用的//公共控件类。InitCtrls.dwICC=ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();SetRegistryKey(_T(应用程序向导生成的本地应用程序));WORDwVersionRequested;wVersionRequested=MAKEWORD(1,1);interr=WSAStartup(wVersionRequested,&wsaData);//TheWindowsSocketsWSAStartupfunctioninitiatesuseofWs2_32.dllbyaprocessif(err!=0)returnFALSE;if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)returnFALSE;5CMyPop3Dlgdlg;m_pMainWnd=&dlg;INT_PTRnResponse=dlg.DoModal();if(nResponse==IDOK){//TODO:在此放置处理何时用//“确定”来关闭对话框的代码}elseif(nResponse==IDCANCEL){//TODO:在此放置处理何时用//“取消”来关闭对话框的代码}//由于对话框已关闭,所以将返回FALSE以便退出应用程序,//而不是启动应用程序的消息泵。returnFALSE;}intCMyPop3App::ExitInstance(){//TODO:在此添加专用代码和/或调用基类WSACleanup();returnCWinApp::ExitInstance();}/**********************************************************************//自定义的通过套接字发送数据函数*************************************************************************/intCMyPop3Dlg::Send(SOCKET&sock,TCHARconst*buf,intlen,intflag){intbytes(0),count(0);while(countlen)//循环执行send函数,直至数据发送完毕为止。{bytes=send(sock,buf+count,len-count,flag);if(bytes==-1||bytes==0)return-1;count+=bytes;6}returncount;}/******************************************************************************//自定义的接收POP3发送的数据的函数******************************************************************************/intCMyPop3Dlg::Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags){intrs;intoffset=0;do{if(offsetlen-2)returnoffset;rs=recv(m_sock,buf+offset,len-offset,flags);if(rs0)/*erroroccur*/return-1;offset+=rs;buf[offset]='\0';}while(strstr(buf,\r\n.\r\n)==(char*)NULL);returnoffset;}/******************************************************************************//从服务器对LIST命令的返回信息中,获取邮件总数******************************************************************************/intCMyPop3Dlg::getMailSum(TCHAR*responseToLIST){intsum=0;TCHAR*p=strstr(responseToLIST,\r\n);if(p==NULL)returnsum;p=strstr(p+2,\r\n);if(p==NULL)7returnsum;while((p=strstr(p+2,\r\n))!=NULL)sum++;returnsum;}/******************************************************************************//从服务器返回的邮件内容中抽取邮件标题***********************************************************************************/boolCMyPop3Dlg::GetSubject(TCHAR*subject,TCHARconst*buf){TCHARconst*p=strstr(buf,Subject:);if(p==NULL)returnfalse;p=p+9;for(inti=0;i32;i++){if(p[i]=='\r'||p[i]=='\n'){subject[i]='\0';break;}subject[i]=p[i];}returntrue;}/******************************************************************************//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)******************************************************************************/intCMyPop3Dlg::loginFail(){GetDlgIt