1、计算机网络应用设计实验报告武汉大学计算机学院课程实验(设计)报告 课程名称: 计算机网络应用设计专业、班: 姓 名: 学 号: 学 期: 2010年上学期 第二部分 软件设计一、实验内容完成FTP客户端、POP3客户端两个系统程序,以及一个应用程序。客户端操作系统为Windows XP。FTP程序要求具有图形化界面、上传、下载功能,鼓励实现断点续传功能,POP3程序具有邮件接收、阅读、删除等基本功能。FTP、POP3程序使用socket方式编程,从创建socket、建立TCP连接开始,实现FTP、SMTP、POP3协议的功能,不得调用第三方控件(可使用操作系统自身的API函数)。编程工具可以使
2、用C#或VC+。应用程序要求实现一个网上书店的基本功能,要求具有前端(用户)和后端(管理)功能,基于Web运行方式。前端具有浏览书目、购物车等功能,后端具有管理书目、基本统计功能。编程工具可以是MS .NET(C#)或者J2EE 二选一,数据库可以是SQL Server、DB2、Oracle、Mysql、PostgreSQL之一。二、实验步骤与实验结果1. FTP源程序说明:本程序使用VC+编写,开发环境为VS2008/*/ 连接FTP 服务器*/void Cmfcftp3Dlg:OnBnClickedButton1() m_pInetSession=new CInternetSession(
3、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) CString m_i; m_i=连接成功rn; m_ftpinfo +=m_i; UpdateData(FALSE); List(); catch (CInternetException *
4、 pEx) CString m_i; m_i=连接no成功rn; m_ftpinfo +=m_i; UpdateData(FALSE); TCHAR szError1024; if ( pEx-GetErrorMessage(szError,1024) m_i=(CString) szError; m_ftpinfo +=m_i; UpdateData(FALSE); else AfxMessageBox(There was an exception); pEx-Delete(); m_pFtpConnection=NULL; /*/ 列出FTP服务器上的所有文件*/void Cmfcftp3
5、Dlg:List() CString m_i; CString m_ii; CStringArray m_Dir; CFtpFileFind finder(m_pFtpConnection); BOOL bWorking=finder.FindFile(_T(*); while (bWorking) bWorking = finder.FindNextFile(); if ( finder.IsDots() ) continue; if (finder.IsDirectory() / 如果是目录。 m_Dir.Add( finder.GetFileName(); else m_i=finder
6、.GetFileName()+rn; for (int j=0;jn;j+) m_ii=t; m_ftpinfo=m_ftpinfo+m_ii; m_ftpinfo +=m_i; UpdateData(FALSE); finder.Close(); for(int i=0;im_Dir.GetSize();i+) n+; m_i=+m_Dir.GetAt(i)+rn; for (int j=1;jSetCurrentDirectory(m_Dir.GetAt(i); List(); BOOL m_suc1=0; while(!m_suc1) m_suc1= m_pFtpConnection-S
7、etCurrentDirectory(.); n-; 2. POP3源程序说明:本程序是使用VC+编写,开发环境为VS2008,这里只贴了与实现相关的代码,界面部分的代码不在此描述了。MyPop3App.cpp 文件:BOOL CMyPop3App:InitInstance() INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); / 将它设置为包括所有要在应用程序中使用的 / 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&
8、InitCtrls); CWinApp:InitInstance(); AfxEnableControlContainer(); SetRegistryKey(_T(应用程序向导生成的本地应用程序); WORD wVersionRequested; wVersionRequested = MAKEWORD(1, 1); int err = WSAStartup(wVersionRequested, &wsaData); /The Windows Sockets WSAStartup function initiates use of Ws2_32.dll by a process if (er
9、r != 0) return FALSE; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return FALSE; CMyPop3Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse = IDOK) / TODO: 在此放置处理何时用 / “确定”来关闭对话框的代码 else if (nResponse = IDCANCEL) / TODO: 在此放置处理何时用 / “取消”来关闭对话框的代码 / 由于对话
10、框已关闭,所以将返回FALSE 以便退出应用程序, / 而不是启动应用程序的消息泵。 return FALSE;int CMyPop3App:ExitInstance() / TODO: 在此添加专用代码和/或调用基类 WSACleanup(); return CWinApp:ExitInstance();/*/ 自定义的通过套接字发送数据函数*/int CMyPop3Dlg:Send(SOCKET& sock, TCHAR const * buf, int len, int flag) int bytes(0), count(0); while ( count len - 2 ) retur
11、n offset; rs = recv(m_sock, buf + offset, len - offset, flags); if ( rs 0 ) /* error occur */ return -1; offset += rs; bufoffset = 0; while ( strstr(buf, rn.rn) = (char*)NULL ); return offset;/*/ 从服务器对LIST 命令的返回信息中,获取邮件总数*/int CMyPop3Dlg:getMailSum(TCHAR* responseToLIST) int sum = 0; TCHAR* p = strs
12、tr(responseToLIST, rn); if ( p = NULL ) return sum; p = strstr(p + 2, rn); if ( p = NULL ) return sum; while ( (p = strstr(p + 2, rn) != NULL ) sum+; return sum;/*/ 从服务器返回的邮件内容中抽取邮件标题*/bool CMyPop3Dlg:GetSubject(TCHAR* subject, TCHAR const * buf) TCHAR const * p = strstr(buf, Subject: ); if ( p = NU
13、LL ) return false; p = p + 9; for (int i = 0; i EnableWindow(TRUE); GetDlgItem(IDC_BUTTON2)-EnableWindow(FALSE); closesocket(m_sock); return 0;/*/ 点击登录按钮*/void CMyPop3Dlg:OnLogin() / TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (m_serverAddr.IsEmpty() SetDlgItemText(IDC_STATIC_ERRORINFO, _T(请填写Pop3 服务器
14、地址); return; else if (m_portNo.IsEmpty() SetDlgItemText(IDC_STATIC_ERRORINFO, _T(请填写端口号); return; else if (m_userName.IsEmpty() SetDlgItemText(IDC_STATIC_ERRORINFO, _T(请填写您的用户名); return; else if (m_passwd.IsEmpty() SetDlgItemText(IDC_STATIC_ERRORINFO, _T(请填写您的邮箱密码); return; GetDlgItem(IDC_BUTTON1)-E
15、nableWindow(FALSE); GetDlgItem(IDC_BUTTON2)-EnableWindow(TRUE); AfxBeginThread(connToServerThread, this); return;/*/ 点击注销按钮*/void CMyPop3Dlg:OnLogoff() / TODO: 在此添加控件通知处理程序代码 TCHAR sendbuf10, recvbuf128; memset(recvbuf, 0, sizeof(recvbuf); strcpy(sendbuf, QUIT rn); / 发送QUIT 消息,结束本次会话。 send(m_sock, s
16、endbuf, strlen(sendbuf), 0); int rt = recv(m_sock, recvbuf, sizeof(recvbuf), 0); / 显示服务器返回的信息。 m_CmdInfo += rnResponse to Quit: ; m_CmdInfo += recvbuf; SetDlgItemText(IDC_EDIT6, m_CmdInfo); if (rt m_sock = socket(AF_INET, SOCK_STREAM, 0); / 创建流式套接字。 / 获取pop3 服务器的IP地址。 struct hostent * p; if (p = get
17、hostbyname(pthis-m_serverAddr) =NULL) pthis-loginFail(); return 1; TCHAR serverIP100; sprintf(serverIP, %u.%u.%u.%u, (unsigned char)p-h_addr_list00, (unsigned char)p-h_addr_list01, (unsigned char)p-h_addr_list02, (unsigned char)p-h_addr_list03); / 创建一个SOCKADDR_IN SOCKADDR_IN sockaddr; sockaddr.sin_f
18、amily = AF_INET; sockaddr.sin_port = htons(atoi(LPCSTR)(LPCTSTR)pthis-m_portNo); sockaddr.sin_addr.S_un.S_addr = inet_addr(serverIP); / 连接到服务器 if (0 != connect(pthis-m_sock, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR) pthis-SetDlgItemText(IDC_STATIC_ERRORINFO, _T(连接服务器失败。输入是否有误?); pthis-loginFail(); retu
19、rn 1; / 检查服务器返回的信息。 TCHAR buf128; memset(buf, 0, sizeof(buf); int returnval(0); returnval = recv(pthis-m_sock, buf, sizeof(buf), 0); if (returnvalSetDlgItemText(IDC_STATIC_ERRORINFO, _T(连接服务器失败。); pthis-loginFail(); return 1; / 保存服务器传回来的信息。 pthis-m_CmdInfo += rnResponse to Conn: ; pthis-m_CmdInfo += buf; pthis-SendMessage(WM_CONNSERVER_SUCX, 0, 0);/*/ 连接服务器成功的消息响应函数*/LRESULT CMyPop3Dlg:login(WPARAM wParam, LPARAM lParam)