FTP客户端与服务器设计文件传输设计.doc_第1页
FTP客户端与服务器设计文件传输设计.doc_第2页
FTP客户端与服务器设计文件传输设计.doc_第3页
FTP客户端与服务器设计文件传输设计.doc_第4页
FTP客户端与服务器设计文件传输设计.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

青海民族大学课 程 设 计 题 目: ftp客户端与服务器设计 院 系: 计算机学院 专 业: 网络工程指导教师: 叶涛班 级: 09网本 小组成员:张建彪、王梧萍、回春英、杨文兰2012年1月7日1. 选题的意义与目的本设计旨在利用winsock 2.0简单实现ftp(file transfer protocol,文件传输协议)的客户端和服务器端程序。通过完成此设计,了解winsock api函数调用方法和一般网络应用程序的编程方法,理解ftp协议,掌握c/c+语言设计ftp协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。 2.设计要求及内容2.1设计要求(1)连入同一局域网的pc,每人一台。(2)pc装有windows操作系统、visual c+ 6.0编译器. (3)四人一组,一台为服务器,其他做客户机。2.1设计内容计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 jpeg 格式保存并且文件扩展名为 .jpg)。主要步骤如下:1服务端接收文件,客户端发送文件。2 每个socket连接同时只能够传输一个文件。3 可同时发送消息3.关键技术3.1 文件传输协议介绍ftp 是file transfer protocol(文件传输协议)的英文简称,用于internet上的控制文件的双向传输。在实现的层面上,ftp又可理解为一个可用于文件传输的客户机/服务器系统(c/s架构),该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为ftp协议。用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序接收到这个文件,将其存放在用户目录中。在通信协议的分层模型中,文件传输协议是在tcp(transmission control protocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。windows操作系统具有tcp/ip协议栈,应用程序可通过winsock api函数的调用实现端到端透明数据链接的建立。3.2 tcp/ip协议tcp/ip协议并不完全符合osi的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而tcp/ip通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(smtp)、文件传输协议(ftp)、网络远程访问协议(telnet)等。传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(tcp)、用户数据报协议(udp)等,tcp和udp给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(ip)。网络接口层(主机-网络层):接收ip数据报并进行传输,从网络上接收物理帧,抽取ip数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如ethernet、serial line等)来传送数据。 3.3 ip协议网际协议ip是tcp/ip的心脏,也是网络层中最重要的协议。ip层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-tcp或udp层;相反,ip层也把从tcp或udp层接收来的数据包传送到更低层。ip数据包是不可靠的,因为ip并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。ip数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。高层的tcp和udp服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,ip地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。ip确认包含一个选项,叫作ip source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些tcp和udp的服务来说,使用了该选项的ip包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠ip源地址做确认的服务将产生问题并且会被非法入侵。在internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机。为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址。就好像每一个住宅都有唯一的门牌一样,才不至于在传输资料时出现混乱。internet的网络地址是指连入internet网络的计算机的地址编号。所以,在internet网络中,网络地址唯一地标识一台计算机。我们都已经知道,internet是由几千万台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就叫做ip(internet protocol的简写)地址,即用internet协议语言表示的地址。 3.4 c/s构架c/s(client/server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到client端和server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是client/server形式的两层结构,由于现在的软件应用系统正在向分布式的web应用发展,web和client/server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。 3.5 客户端(client)客户端(client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。3.6 服务器(server)服务器指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。相对于普通pc来说,服务器在稳定性、安全性、性能等方面都要求更高,因此cpu、芯片组、内存、磁盘系统、网络等硬件和普通pc有所不同。4.代码程序 服务器端代码/recvdlg。cpp实施文件/#include stdafx.h#include recv.h#include recvdlg.h#include sysutils.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif / caboutdlg对话框用于应用程序/class caboutdlg : public cdialogpublic:caboutdlg(); / 对话数据/afx_data(caboutdlg)enum idd = idd_aboutbox ;/afx_data/ classwizard生成的虚拟函数覆盖/afx_virtual(caboutdlg)protected:virtual void dodataexchange(cdataexchange* pdx); / ddx / ddv支持/afx_virtual / 实施程序protected:/afx_msg(caboutdlg)/afx_msgdeclare_message_map();caboutdlg:caboutdlg() : cdialog(caboutdlg:idd)/afx_data_init(caboutdlg)/afx_data_initvoid caboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ / crecvdlg对话框/crecvdlg:crecvdlg(cwnd* pparent /*=null*/): cdialog(crecvdlg:idd, pparent)/afx_data_init(crecvdlg)/ 注意:classwizard添加成员初始化将在这里/afx_data_init/ 注意loadicon不需要一个后续destroyicon win32中m_hicon = afxgetapp()-loadicon(idr_mainframe);m_ptcpserver1 = new ctcpserver(this);crecvdlg:crecvdlg(void)delete m_ptcpserver1;m_ptcpserver1 = null;void crecvdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(crecvdlg)ddx_control(pdx, idc_conn_count, m_ctlcnncount);ddx_control(pdx, idc_info1, m_ctlinfo1);/afx_data_mapbegin_message_map(crecvdlg, cdialog)/afx_msg_map(crecvdlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_cancel_recv, oncancelrecv)on_bn_clicked(idc_close_cnn, onclosecnn)on_wm_destroy()/afx_msg_mapend_message_map()/ / crecvdlg消息处理/bool crecvdlg:oninitdialog()cdialog:oninitdialog();/ 加上“关于“菜单项目系统菜单。/ idm_aboutbox必须在系统指挥的范围。assert(idm_aboutbox & 0xfff0) = idm_aboutbox);assert(idm_aboutbox appendmenu(mf_separator);psysmenu-appendmenu(mf_string, idm_aboutbox, straboutmenu);/ 这个对话框设置图标。这是不是自动的框架/ 当应用程序的主窗口是没有一个对话框seticon(m_hicon, true);/ 定义大图标seticon(m_hicon, false);/ 定义小图标m_ptcpserver1-setbindaddr();m_ptcpserver1-setport(8000);m_ptcpserver1-setonaccept(onaccept);m_ptcpserver1-setonaccepterr(onaccepterr);m_ptcpserver1-setonsocketconnect(onsocketconnect);m_ptcpserver1-setonsocketdisconnect(onsocketdisconnect);m_ptcpserver1-setonsocketsenderr(onsocketsenderr);m_ptcpserver1-setonsocketrecverr(onsocketrecverr);m_ptcpserver1-setononenetmsg(ononenetmsg);m_ptcpserver1-setonrecvfilestart(onrecvfilestart);m_ptcpserver1-setonrecvfileprogress(onrecvfileprogress);m_ptcpserver1-setonrecvfilefail(onrecvfilefail);m_ptcpserver1-setonrecvfilesucc(onrecvfilesucc);m_ptcpserver1-setonrecvfilecancel(onrecvfilecancel);if(!m_ptcpserver1-startaccept()afxmessagebox(开始服务失败);return false;return true; / return true unless you set the focus to a controlvoid crecvdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);/ if you add a minimize button to your dialog, you wil need the code below/ to draw the icon. for mfc applications using the document/view model,/ this is automatically done for you by the framework.void crecvdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.getsafehdc(), 0);/ center icon in client rectangleint cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;/ draw the icondc.drawicon(x, y, m_hicon);elsecdialog:onpaint();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor crecvdlg:onquerydragicon()return (hcursor) m_hicon;void crecvdlg:onaccept(void *pnotifyobj, socket hsocket, bool &baccept)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;strinfo.format(onaccept-%d, hsocket);precvdlg-dispinfo(strinfo);void crecvdlg:onaccepterr(void *pnotifyobj, socket haccept)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;strinfo.format(onaccepterr-%d, haccept);precvdlg-dispinfo(strinfo);void crecvdlg:ononenetmsg(void *pnotifyobj, char *msg, int nmsglen)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;char s10240;memcpy(s, msg, nmsglen);snmsglen = 0;strinfo = (lpctstr)s;precvdlg-dispinfo(strinfo);void crecvdlg:onrecvfilestart(void *pnotifyobj, char *szpathname, bool &brecv)void crecvdlg:onrecvfileprogress(void *pnotifyobj, dword dwrecvedbytes, dword dwfilesize)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;strinfo.format(%d / %d, dwrecvedbytes, dwfilesize);precvdlg-dispinfo(strinfo);void crecvdlg:onrecvfilesucc(void *pnotifyobj, char *szpathname)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo = onrecvfilesucc;precvdlg-dispinfo(strinfo);void crecvdlg:onrecvfilefail(void *pnotifyobj, char *szpathname)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo = onrecvfilefail;precvdlg-dispinfo(strinfo);void crecvdlg:onrecvfilecancel(void *pnotifyobj, char *szpathname)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo = onrecvfilecancel;precvdlg-dispinfo(strinfo);void crecvdlg:dispinfo(cstring &strinfo)m_ctlinfo1.setwindowtext(strinfo);void crecvdlg:dispcnncount(void)cstring strcnncount;strcnncount.format(%d, m_ptcpserver1-getclientcount();m_ctlcnncount.setwindowtext(strcnncount);void crecvdlg:oncancelrecv() m_ptcpserver1-cancelallrecvfile();void crecvdlg:onsocketconnect(void *pnotifyobj, socket hsocket)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;strinfo.format(onsocketconnect-%d, hsocket);precvdlg-dispinfo(strinfo);precvdlg-dispcnncount();void crecvdlg:onsocketdisconnect(void *pnotifyobj, socket hsocket)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo;strinfo.format(onsocketdisconnect-%d, hsocket);precvdlg-dispinfo(strinfo);precvdlg-dispcnncount();void crecvdlg:onsocketsenderr(void *pnotifyobj, cserverclientsocket *pserverclientsocket)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo = onsocketsenderr;precvdlg-dispinfo(strinfo);void crecvdlg:onsocketrecverr(void*pnotifyobj,cserverclientsocket *pserverclientsocket)crecvdlg *precvdlg = (crecvdlg *)pnotifyobj;cstring strinfo = onsocketrecverr;precvdlg-dispinfo(strinfo);void crecvdlg:onclosecnn() void crecvdlg:ondestroy() cdialog:ondestroy();m_ptcpserver1-closeallserverclientsocket();客户端代码 / senddlg。cpp实施文件/#include stdafx.h#include send.h#include senddlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg对话框用于应用程序/class caboutdlg : public cdialogpublic:caboutdlg();/ dialog data/afx_data(caboutdlg)enum idd = idd_aboutbox ;/afx_data/ classwizard generated virtual function overrides/afx_virtual(caboutdlg)protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementationprotected:/afx_msg(caboutdlg)/afx_msgdeclare_message_map();caboutdlg:caboutdlg() : cdialog(caboutdlg:idd)/afx_data_init(caboutdlg)/afx_data_initvoid caboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ csenddlg对话框/csenddlg:csenddlg(cwnd* pparent /*=null*/): cdialog(csenddlg:idd, pparent)/afx_data_init(csenddlg)m_dwpackagesize = 0;m_strserverip = _t();m_nport = 0;m_strfilename = _t();m_strmsg = _t();/afx_data_init/ note that loadicon does not require a subsequent destroyicon in win32m_hicon = afxgetapp()-loadicon(idr_mainframe);m_ptcpclient = new ctcpclient(this);csenddlg:csenddlg(void)delete m_ptcpclient;void csenddlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(csenddlg)ddx_control(pdx, idc_cnn_status, m_ctlcnnstatus);ddx_control(pdx, idc_info, m_ctlinfo);ddx_text(pdx, idc_package_size, m_dwpackagesize);ddv_minmaxint(pdx, m_dwpackagesize, 1, 99996);ddx_text(pdx, idc_server_ip, m_strserverip);ddx_text(pdx, idc_port, m_nport);ddx_text(pdx, idc_file_name, m_strfilename);ddx_text(pdx, idc_msg, m_strmsg);/afx_data_mapbegin_message_map(csenddlg, cdialog)/afx_msg_map(csenddlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_connect, onconnect)on_bn_clicked(idc_disconnect, ondisconnect)on_bn_clicked(idc_send, onsendfile)on_bn_clicked(idc_send_msg, onsendmsg)on_bn_clicked(idc_cancel_send, oncancelsend)on_wm_destroy()/afx_msg_mapend_message_map()/ csenddlg message handlersbool csenddlg:oninitdialog()cdialog:oninitdialog();/ add about. menu item to system menu./ idm_aboutbox must be in the system command range.assert(idm_aboutbox & 0xfff0) = idm_aboutbox);assert(idm_aboutbox appendmenu(mf_separator);psysmenu-appendmenu(mf_string, idm_aboutbox, straboutmenu);/ set the icon for this dialog. the framework does this automatically/ when the applications main window is not a dialogseticon(m_hicon, true);/ set big iconseticon(m_hicon, false);/ set small iconm_strserverip = ;m_nport = 8000;m_dwpackagesize = 1024;m_strfilename = d:a.pdf;updatedata(false);m_ptcpclient-setonsocketsenderr(onsocketsenderr);m_ptcpclient-setonsocketrecverr(onsocketrecverr);m_ptcpclient-setonsocketclose(onsocketclose);m_ptcpclient-setononenetmsg(ononenetmsg);m_ptcpclient-setonsendfilesucc(onsendfilesucc);m_ptcpclient-setonsendfilefail(onsendfilefail);m_ptcpclient-setonsendfilerefuserecv(onsendfilerefuserecv);m_ptcpclient-setonsendfilecancelrecv(onsendfilecancelrecv);m_ptcpclient-setonsendfilerecvfail(onsendfilerecvfail);m_ptcpclient-setonsendfileprogress(onsendfileprogress);return true; / return true unless you set the focus to a controlvoid csenddlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);/ if you add a minimize button to your dialog, you will need the code below/ to draw the icon. for mfc applications using the document/view model,/ this is automatically done for you by the framework.void csenddlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.getsafehdc(), 0);/ center icon in client rectangleint cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;/ draw the icondc.drawicon(x, y, m_hicon);elsecdialog:onpaint();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor csenddlg:onquerydragicon()return (hcursor) m_hicon;void csenddlg:onconnect() if(!updatedata()return;m_ptcpclient-setaddr(char *)(lpctstr)m_strserverip);m_ptcpclient-setport(m_nport);m_ptcpclient-setpackagesize(m_dwpackagesize);m_ctlcnnstatus.setwindowtext(请等待.);if(!m_ptcpclient-connect()m_ctlcnnstatus.setwindowtext(连接失败!);elsem_ctlcnnstatus.setwindowtext(已连接);void csenddlg:ondisconnect() m_ptcpclient-disconnect();m_ctlcnnstatus.setwindowtext(断开连接);void csenddlg:onsendfile() if(!updatedata()return;m_ptcpclient-setpackagesize(m_dwpackagesize);if(!m_ptcpclient-sendfile(char *)(lpctstr)m_strfilename)afxmessagebox(发生文件失败);void csenddlg:onsendmsg(void)char s99999;if(!updatedata()return;sprintf(s, 00000001%s, m_strmsg);m_ptcpclient-sendnetmsg(s, strlen(s) - 6);void csenddlg:onsocketsenderr(void *pnotifyobj, socket hsocket)csenddlg *psenddlg = (csenddlg *)pnotifyobj;psenddlg-m_ctlcnnstatus.setwindowtext(发送数据出错);void csenddlg:onsocketrecverr(void *pnotifyobj, socket hsocket)csenddlg *psenddlg = (csenddlg *)pnotifyob

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论