计算机网络应用设计实验报告.docx
《计算机网络应用设计实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络应用设计实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
计算机网络应用设计实验报告
大学计算机学院
课程实验(设计)报告
课程名称:
计算机网络应用设计
专业、班:
姓名:
学号:
学期:
2010年上学期
第二部分软件设计
一、实验容
完成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;
m_i="连接成功\r\n";
m_ftpinfo+=m_i;
UpdateData(FALSE);
List();
}
catch(CInternetException*pEx)
m_i="连接no成功\r\n";
TCHARszError[1024];
if(pEx->GetErrorMessage(szError,1024))
m_i=(CString)szError;
else
AfxMessageBox("Therewasanexception");
pEx->Delete();
m_pFtpConnection=NULL;
/*********************************************************************
//列出FTP服务器上的所有文件
****************************************************************************/
List()
CStringm_ii;
CStringArraym_Dir;
CFtpFileFindfinder(m_pFtpConnection);
BOOLbWorking=finder.FindFile(_T("*"));
while(bWorking)
bWorking=finder.FindNextFile();
if(finder.IsDots())
continue;
if(finder.IsDirectory())//如果是目录。
m_Dir.Add(finder.GetFileName());
m_i=finder.GetFileName()+"\r\n";
for(intj=0;j{m_ii="\t";m_ftpinfo=m_ftpinfo+m_ii;}m_ftpinfo+=m_i;UpdateData(FALSE);}}finder.Close();for(inti=0;i{n++;m_i="["+m_Dir.GetAt(i)+"]"+"\r\n";for(intj=1;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));}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;CMyPop3Dlgdlg;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(count{bytes=send(sock,buf+count,len-count,flag);if(bytes==-1||bytes==0)return-1;count+=bytes;}returncount;} /******************************************************************************//自定义的接收POP3发送的数据的函数******************************************************************************/intCMyPop3Dlg::Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags){intrs;intoffset=0;do{if(offset>len-2)returnoffset;rs=recv(m_sock,buf+offset,len-offset,flags);if(rs<0)/*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)returnsum;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;i<32;i++){if(p[i]=='\r'||p[i]=='\n'){subject[i]='\0';break;}subject[i]=p[i];}returntrue;} /******************************************************************************//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)******************************************************************************/intCMyPop3Dlg::loginFail(){GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);closesocket(m_sock);return0;} /******************************************************************************//点击登录按钮******************************************************************************/voidCMyPop3Dlg::OnLogin(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);if(m_serverAddr.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写Pop3服务器地址"));return;}elseif(m_portNo.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写端口号"));return;}elseif(m_userName.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的用户名"));return;}elseif(m_passwd.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的密码"));return;}GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);AfxBeginThread(connToServerThread,this);return;} /******************************************************************************//点击注销按钮******************************************************************************/voidCMyPop3Dlg::OnLogoff(){//TODO:在此添加控件通知处理程序代码TCHARsendbuf[10],recvbuf[128];memset(recvbuf,0,sizeof(recvbuf));strcpy(sendbuf,"QUIT\r\n");//发送QUIT消息,结束本次会话。send(m_sock,sendbuf,strlen(sendbuf),0);intrt=recv(m_sock,recvbuf,sizeof(recvbuf),0);//显示服务器返回的信息。m_CmdInfo+="\r\nResponsetoQuit:";m_CmdInfo+=recvbuf;SetDlgItemText(IDC_EDIT6,m_CmdInfo);if(rt<=0||strncmp(recvbuf,"+OK",3)!=0){SetDlgItemText(IDC_STATIC_ERRORINFO,"注销失败!");return;}loginFail();SetDlgItemText(IDC_STATIC_ERRORINFO,"注销成功!");} /******************************************************************************//点击收取按钮******************************************************************************/voidCMyPop3Dlg::OnReceiveLetters(){//TODO:在此添加控件通知处理程序代码AfxBeginThread(recvLetterThread,this);return;} /******************************************************************************//连接服务器线程******************************************************************************/UINTCMyPop3Dlg::connToServerThread(LPVOIDlpVoid){CMyPop3Dlg*pthis=(CMyPop3Dlg*)lpVoid;pthis->m_sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字。 //获取pop3服务器的IP地址。structhostent*p;if((p=gethostbyname(pthis->m_serverAddr))==NULL){pthis->loginFail();return1;}TCHARserverIP[100];sprintf(serverIP,"%u.%u.%u.%u",(unsignedchar)p->h_addr_list[0][0],(unsignedchar)p->h_addr_list[0][1],(unsignedchar)p->h_addr_list[0][2],(unsignedchar)p->h_addr_list[0][3]); //创建一个SOCKADDR_INSOCKADDR_INsockaddr;sockaddr.sin_family=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();return1;} //检查服务器返回的信息。TCHARbuf[128];memset(buf,0,sizeof(buf));intreturnval(0);returnval=recv(pthis->m_sock,buf,sizeof(buf),0);if(returnval<=0||strncmp(buf,"+OK",3)!=0){pthis->SetDlgItemText(IDC_STATIC_ERRORINFO,_T("连接服务器失败。"));pthis->loginFail();return1;}//保存服务器传回来的信息。pthis->m_CmdInfo+="\r\nResponsetoConn:";pthis->m_CmdInfo+=buf;pthis->SendMessage(WM_CONNSERVER_SUCX,0,0);} /****************************************************************************//连接服务器成功的消息响应函数******************************************************************************/LRESULTCMyPop3Dlg::login(WPARAMwParam,LPARAMlParam){//显示服务器传回来的信息SetDlgItemText(IDC_EDIT6,m_
m_ii="\t";
m_ftpinfo=m_ftpinfo+m_ii;
finder.Close();
for(inti=0;i{n++;m_i="["+m_Dir.GetAt(i)+"]"+"\r\n";for(intj=1;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));}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;CMyPop3Dlgdlg;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(count{bytes=send(sock,buf+count,len-count,flag);if(bytes==-1||bytes==0)return-1;count+=bytes;}returncount;} /******************************************************************************//自定义的接收POP3发送的数据的函数******************************************************************************/intCMyPop3Dlg::Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags){intrs;intoffset=0;do{if(offset>len-2)returnoffset;rs=recv(m_sock,buf+offset,len-offset,flags);if(rs<0)/*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)returnsum;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;i<32;i++){if(p[i]=='\r'||p[i]=='\n'){subject[i]='\0';break;}subject[i]=p[i];}returntrue;} /******************************************************************************//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)******************************************************************************/intCMyPop3Dlg::loginFail(){GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);closesocket(m_sock);return0;} /******************************************************************************//点击登录按钮******************************************************************************/voidCMyPop3Dlg::OnLogin(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);if(m_serverAddr.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写Pop3服务器地址"));return;}elseif(m_portNo.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写端口号"));return;}elseif(m_userName.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的用户名"));return;}elseif(m_passwd.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的密码"));return;}GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);AfxBeginThread(connToServerThread,this);return;} /******************************************************************************//点击注销按钮******************************************************************************/voidCMyPop3Dlg::OnLogoff(){//TODO:在此添加控件通知处理程序代码TCHARsendbuf[10],recvbuf[128];memset(recvbuf,0,sizeof(recvbuf));strcpy(sendbuf,"QUIT\r\n");//发送QUIT消息,结束本次会话。send(m_sock,sendbuf,strlen(sendbuf),0);intrt=recv(m_sock,recvbuf,sizeof(recvbuf),0);//显示服务器返回的信息。m_CmdInfo+="\r\nResponsetoQuit:";m_CmdInfo+=recvbuf;SetDlgItemText(IDC_EDIT6,m_CmdInfo);if(rt<=0||strncmp(recvbuf,"+OK",3)!=0){SetDlgItemText(IDC_STATIC_ERRORINFO,"注销失败!");return;}loginFail();SetDlgItemText(IDC_STATIC_ERRORINFO,"注销成功!");} /******************************************************************************//点击收取按钮******************************************************************************/voidCMyPop3Dlg::OnReceiveLetters(){//TODO:在此添加控件通知处理程序代码AfxBeginThread(recvLetterThread,this);return;} /******************************************************************************//连接服务器线程******************************************************************************/UINTCMyPop3Dlg::connToServerThread(LPVOIDlpVoid){CMyPop3Dlg*pthis=(CMyPop3Dlg*)lpVoid;pthis->m_sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字。 //获取pop3服务器的IP地址。structhostent*p;if((p=gethostbyname(pthis->m_serverAddr))==NULL){pthis->loginFail();return1;}TCHARserverIP[100];sprintf(serverIP,"%u.%u.%u.%u",(unsignedchar)p->h_addr_list[0][0],(unsignedchar)p->h_addr_list[0][1],(unsignedchar)p->h_addr_list[0][2],(unsignedchar)p->h_addr_list[0][3]); //创建一个SOCKADDR_INSOCKADDR_INsockaddr;sockaddr.sin_family=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();return1;} //检查服务器返回的信息。TCHARbuf[128];memset(buf,0,sizeof(buf));intreturnval(0);returnval=recv(pthis->m_sock,buf,sizeof(buf),0);if(returnval<=0||strncmp(buf,"+OK",3)!=0){pthis->SetDlgItemText(IDC_STATIC_ERRORINFO,_T("连接服务器失败。"));pthis->loginFail();return1;}//保存服务器传回来的信息。pthis->m_CmdInfo+="\r\nResponsetoConn:";pthis->m_CmdInfo+=buf;pthis->SendMessage(WM_CONNSERVER_SUCX,0,0);} /****************************************************************************//连接服务器成功的消息响应函数******************************************************************************/LRESULTCMyPop3Dlg::login(WPARAMwParam,LPARAMlParam){//显示服务器传回来的信息SetDlgItemText(IDC_EDIT6,m_
n++;
m_i="["+m_Dir.GetAt(i)+"]"+"\r\n";
for(intj=1;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));}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;CMyPop3Dlgdlg;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(count{bytes=send(sock,buf+count,len-count,flag);if(bytes==-1||bytes==0)return-1;count+=bytes;}returncount;} /******************************************************************************//自定义的接收POP3发送的数据的函数******************************************************************************/intCMyPop3Dlg::Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags){intrs;intoffset=0;do{if(offset>len-2)returnoffset;rs=recv(m_sock,buf+offset,len-offset,flags);if(rs<0)/*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)returnsum;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;i<32;i++){if(p[i]=='\r'||p[i]=='\n'){subject[i]='\0';break;}subject[i]=p[i];}returntrue;} /******************************************************************************//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)******************************************************************************/intCMyPop3Dlg::loginFail(){GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);closesocket(m_sock);return0;} /******************************************************************************//点击登录按钮******************************************************************************/voidCMyPop3Dlg::OnLogin(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);if(m_serverAddr.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写Pop3服务器地址"));return;}elseif(m_portNo.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写端口号"));return;}elseif(m_userName.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的用户名"));return;}elseif(m_passwd.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的密码"));return;}GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);AfxBeginThread(connToServerThread,this);return;} /******************************************************************************//点击注销按钮******************************************************************************/voidCMyPop3Dlg::OnLogoff(){//TODO:在此添加控件通知处理程序代码TCHARsendbuf[10],recvbuf[128];memset(recvbuf,0,sizeof(recvbuf));strcpy(sendbuf,"QUIT\r\n");//发送QUIT消息,结束本次会话。send(m_sock,sendbuf,strlen(sendbuf),0);intrt=recv(m_sock,recvbuf,sizeof(recvbuf),0);//显示服务器返回的信息。m_CmdInfo+="\r\nResponsetoQuit:";m_CmdInfo+=recvbuf;SetDlgItemText(IDC_EDIT6,m_CmdInfo);if(rt<=0||strncmp(recvbuf,"+OK",3)!=0){SetDlgItemText(IDC_STATIC_ERRORINFO,"注销失败!");return;}loginFail();SetDlgItemText(IDC_STATIC_ERRORINFO,"注销成功!");} /******************************************************************************//点击收取按钮******************************************************************************/voidCMyPop3Dlg::OnReceiveLetters(){//TODO:在此添加控件通知处理程序代码AfxBeginThread(recvLetterThread,this);return;} /******************************************************************************//连接服务器线程******************************************************************************/UINTCMyPop3Dlg::connToServerThread(LPVOIDlpVoid){CMyPop3Dlg*pthis=(CMyPop3Dlg*)lpVoid;pthis->m_sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字。 //获取pop3服务器的IP地址。structhostent*p;if((p=gethostbyname(pthis->m_serverAddr))==NULL){pthis->loginFail();return1;}TCHARserverIP[100];sprintf(serverIP,"%u.%u.%u.%u",(unsignedchar)p->h_addr_list[0][0],(unsignedchar)p->h_addr_list[0][1],(unsignedchar)p->h_addr_list[0][2],(unsignedchar)p->h_addr_list[0][3]); //创建一个SOCKADDR_INSOCKADDR_INsockaddr;sockaddr.sin_family=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();return1;} //检查服务器返回的信息。TCHARbuf[128];memset(buf,0,sizeof(buf));intreturnval(0);returnval=recv(pthis->m_sock,buf,sizeof(buf),0);if(returnval<=0||strncmp(buf,"+OK",3)!=0){pthis->SetDlgItemText(IDC_STATIC_ERRORINFO,_T("连接服务器失败。"));pthis->loginFail();return1;}//保存服务器传回来的信息。pthis->m_CmdInfo+="\r\nResponsetoConn:";pthis->m_CmdInfo+=buf;pthis->SendMessage(WM_CONNSERVER_SUCX,0,0);} /****************************************************************************//连接服务器成功的消息响应函数******************************************************************************/LRESULTCMyPop3Dlg::login(WPARAMwParam,LPARAMlParam){//显示服务器传回来的信息SetDlgItemText(IDC_EDIT6,m_
BOOLm_suc=0;
while(!
m_suc)
m_suc=m_pFtpConnection->SetCurrentDirectory(m_Dir.GetAt(i));
BOOLm_suc1=0;
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.dllbyaprocess
if(err!
=0)
returnFALSE;
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1)
CMyPop3Dlgdlg;
m_pMainWnd=&dlg;
INT_PTRnResponse=dlg.DoModal();
if(nResponse==IDOK)
//TODO:
在此放置处理何时用
//“确定”来关闭对话框的代码
elseif(nResponse==IDCANCEL)
//“取消”来关闭对话框的代码
//由于对话框已关闭,所以将返回FALSE以便退出应用程序,
//而不是启动应用程序的消息泵。
intCMyPop3App:
ExitInstance()
在此添加专用代码和/或调用基类
WSACleanup();
returnCWinApp:
ExitInstance();
/**********************************************************************
//自定义的通过套接字发送数据函数
*************************************************************************/
intCMyPop3Dlg:
Send(SOCKET&sock,TCHARconst*buf,intlen,intflag)
intbytes(0),count(0);
while(count{bytes=send(sock,buf+count,len-count,flag);if(bytes==-1||bytes==0)return-1;count+=bytes;}returncount;} /******************************************************************************//自定义的接收POP3发送的数据的函数******************************************************************************/intCMyPop3Dlg::Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags){intrs;intoffset=0;do{if(offset>len-2)returnoffset;rs=recv(m_sock,buf+offset,len-offset,flags);if(rs<0)/*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)returnsum;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;i<32;i++){if(p[i]=='\r'||p[i]=='\n'){subject[i]='\0';break;}subject[i]=p[i];}returntrue;} /******************************************************************************//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)******************************************************************************/intCMyPop3Dlg::loginFail(){GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);closesocket(m_sock);return0;} /******************************************************************************//点击登录按钮******************************************************************************/voidCMyPop3Dlg::OnLogin(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);if(m_serverAddr.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写Pop3服务器地址"));return;}elseif(m_portNo.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写端口号"));return;}elseif(m_userName.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的用户名"));return;}elseif(m_passwd.IsEmpty()){SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的密码"));return;}GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);AfxBeginThread(connToServerThread,this);return;} /******************************************************************************//点击注销按钮******************************************************************************/voidCMyPop3Dlg::OnLogoff(){//TODO:在此添加控件通知处理程序代码TCHARsendbuf[10],recvbuf[128];memset(recvbuf,0,sizeof(recvbuf));strcpy(sendbuf,"QUIT\r\n");//发送QUIT消息,结束本次会话。send(m_sock,sendbuf,strlen(sendbuf),0);intrt=recv(m_sock,recvbuf,sizeof(recvbuf),0);//显示服务器返回的信息。m_CmdInfo+="\r\nResponsetoQuit:";m_CmdInfo+=recvbuf;SetDlgItemText(IDC_EDIT6,m_CmdInfo);if(rt<=0||strncmp(recvbuf,"+OK",3)!=0){SetDlgItemText(IDC_STATIC_ERRORINFO,"注销失败!");return;}loginFail();SetDlgItemText(IDC_STATIC_ERRORINFO,"注销成功!");} /******************************************************************************//点击收取按钮******************************************************************************/voidCMyPop3Dlg::OnReceiveLetters(){//TODO:在此添加控件通知处理程序代码AfxBeginThread(recvLetterThread,this);return;} /******************************************************************************//连接服务器线程******************************************************************************/UINTCMyPop3Dlg::connToServerThread(LPVOIDlpVoid){CMyPop3Dlg*pthis=(CMyPop3Dlg*)lpVoid;pthis->m_sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字。 //获取pop3服务器的IP地址。structhostent*p;if((p=gethostbyname(pthis->m_serverAddr))==NULL){pthis->loginFail();return1;}TCHARserverIP[100];sprintf(serverIP,"%u.%u.%u.%u",(unsignedchar)p->h_addr_list[0][0],(unsignedchar)p->h_addr_list[0][1],(unsignedchar)p->h_addr_list[0][2],(unsignedchar)p->h_addr_list[0][3]); //创建一个SOCKADDR_INSOCKADDR_INsockaddr;sockaddr.sin_family=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();return1;} //检查服务器返回的信息。TCHARbuf[128];memset(buf,0,sizeof(buf));intreturnval(0);returnval=recv(pthis->m_sock,buf,sizeof(buf),0);if(returnval<=0||strncmp(buf,"+OK",3)!=0){pthis->SetDlgItemText(IDC_STATIC_ERRORINFO,_T("连接服务器失败。"));pthis->loginFail();return1;}//保存服务器传回来的信息。pthis->m_CmdInfo+="\r\nResponsetoConn:";pthis->m_CmdInfo+=buf;pthis->SendMessage(WM_CONNSERVER_SUCX,0,0);} /****************************************************************************//连接服务器成功的消息响应函数******************************************************************************/LRESULTCMyPop3Dlg::login(WPARAMwParam,LPARAMlParam){//显示服务器传回来的信息SetDlgItemText(IDC_EDIT6,m_
bytes=send(sock,buf+count,len-count,flag);
if(bytes==-1||bytes==0)
return-1;
count+=bytes;
returncount;
//自定义的接收POP3发送的数据的函数
Pop3Recv(SOCKET&m_sock,TCHAR*buf,intlen,intflags)
intrs;
intoffset=0;
do
if(offset>len-2)
returnoffset;
rs=recv(m_sock,buf+offset,len-offset,flags);
if(rs<0)/*erroroccur*/
offset+=rs;
buf[offset]='\0';
}while(strstr(buf,"\r\n.\r\n")==(char*)NULL);
//从服务器对LIST命令的返回信息中,获取总数
getMailSum(TCHAR*responseToLIST)
intsum=0;
TCHAR*p=strstr(responseToLIST,"\r\n");
if(p==NULL)
returnsum;
p=strstr(p+2,"\r\n");
while((p=strstr(p+2,"\r\n"))!
sum++;
//从服务器返回的容中抽取标题
***********************************************************************************/
boolCMyPop3Dlg:
GetSubject(TCHAR*subject,TCHARconst*buf)
TCHARconst*p=strstr(buf,"Subject:
");
returnfalse;
p=p+9;
for(inti=0;i<32;i++)
if(p[i]=='\r'||p[i]=='\n')
subject[i]='\0';
break;
subject[i]=p[i];
returntrue;
//登录失败时的善后处理(关闭套接字、禁用注销按钮、启用登录按钮)
loginFail()
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
closesocket(m_sock);
return0;
//点击登录按钮
voidCMyPop3Dlg:
OnLogin()
在此添加控件通知处理程序代码
if(m_serverAddr.IsEmpty())
SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写Pop3服务器地址"));
return;
elseif(m_portNo.IsEmpty())
SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写端口号"));
elseif(m_userName.IsEmpty())
SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的用户名"));
elseif(m_passwd.IsEmpty())
SetDlgItemText(IDC_STATIC_ERRORINFO,_T("请填写您的密码"));
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
AfxBeginThread(connToServerThread,this);
//点击注销按钮
OnLogoff()
TCHARsendbuf[10],recvbuf[128];
memset(recvbuf,0,sizeof(recvbuf));
strcpy(sendbuf,"QUIT\r\n");
//发送QUIT消息,结束本次会话。
send(m_sock,sendbuf,strlen(sendbuf),0);
intrt=recv(m_sock,recvbuf,sizeof(recvbuf),0);
//显示服务器返回的信息。
m_CmdInfo+="\r\nResponsetoQuit:
";
m_CmdInfo+=recvbuf;
SetDlgItemText(IDC_EDIT6,m_CmdInfo);
if(rt<=0||strncmp(recvbuf,"+OK",3)!
SetDlgItemText(IDC_STATIC_ERRORINFO,"注销失败!
loginFail();
SetDlgItemText(IDC_STATIC_ERRORINFO,"注销成功!
//点击收取按钮
OnReceiveLetters()
AfxBeginThread(recvLetterThread,this);
//连接服务器线程
UINTCMyPop3Dlg:
connToServerThread(LPVOIDlpVoid)
CMyPop3Dlg*pthis=(CMyPop3Dlg*)lpVoid;
pthis->m_sock=socket(AF_INET,SOCK_STREAM,0);//创建流式套接字。
//获取pop3服务器的IP地址。
structhostent*p;
if((p=gethostbyname(pthis->m_serverAddr))==NULL)
pthis->loginFail();
return1;
TCHARserverIP[100];
sprintf(serverIP,"%u.%u.%u.%u",
(unsignedchar)p->h_addr_list[0][0],
(unsignedchar)p->h_addr_list[0][1],
(unsignedchar)p->h_addr_list[0][2],
(unsignedchar)p->h_addr_list[0][3]);
//创建一个SOCKADDR_IN
SOCKADDR_INsockaddr;
sockaddr.sin_family=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("连接服务器失败。
输入是否有误?
"));
//检查服务器返回的信息。
TCHARbuf[128];
memset(buf,0,sizeof(buf));
intreturnval(0);
returnval=recv(pthis->m_sock,buf,sizeof(buf),0);
if(returnval<=0||strncmp(buf,"+OK",3)!
//保存服务器传回来的信息。
pthis->m_CmdInfo+="\r\nResponsetoConn:
pthis->m_CmdInfo+=buf;
pthis->SendMessage(WM_CONNSERVER_SUCX,0,0);
/****************************************************************************
//连接服务器成功的消息响应函数
LRESULTCMyPop3Dlg:
login(WPARAMwParam,LPARAMlParam)
//显示服务器传回来的信息
SetDlgItemText(IDC_EDIT6,m_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1