TCPIP协议分析与应用编程课程设计报告_第1页
TCPIP协议分析与应用编程课程设计报告_第2页
TCPIP协议分析与应用编程课程设计报告_第3页
TCPIP协议分析与应用编程课程设计报告_第4页
TCPIP协议分析与应用编程课程设计报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、tcp/ip协议分析与应用编程课程设计报告一、 团队介绍二、 实验步骤三、 实验体会一、 团队介绍二、 实验步骤1使用mfc appwizard创建客户端应用程序框架。2为对话框界面添加控件对象3为对话框中的控件对象定义相应的成员变量4创建从casyncsocket类继承的派生类5手工添加的代码6添加事件函数和成员函数的代码7进行测试。 客户端程序的主要功能的代码和分析1应用程序类ctcapp对应的文件应用程序类ctcapp,对应的文件是tc.h和tc.cpp;tc.h定义了ctcapp类,tc.cpp是该类的实现代码,完全由vc+自动创建,用户不必作任何改动。2派生的套接字类ccsocket

2、对应的文件ccsocket类对应csocket.h头文件和csocket.cpp文件。3.cmsg类对应的文件msg.h头文件和msg.cpp文件。4对话框类ctcdlg对应的文件对话框类cttcdlg,对应的文件是tcdlg.h和tcdlg.cpp。5其他文件对于vc+为tc工程创建的其他文件,如stdafx.h和stdafx.cpp,以及resource.h和tc.rc都不需要作任何处理。 创建客户端应用程序1使用mfc appwizard创建客户端应用程序框架。(1)在new对话框中,选择projects卡,如图所示。从左边的列表框中选择mfc appwizard(exe)条目,在右边的

3、project name处填入工程名tc,在location处选定存放此工程的目录。然后点击ok按钮(2)出现mfc appwizard设置的第一步对话框(mfc appwizard step 1),如图所示。从中选择dialog based的应用程序类型,语言支持选择中文(中国),使此工程能够正确地进行中文的输入、输出、显示及处理。然后点击next按钮。 (3)出现mfc appwizard设置的第二步对话框(mfc appwizards step 2 of 4),如图所示,在windows sockets复选框上打上选择标记,表示应用程序将支持winsock套接字。接受其它的默认设置。跳过

4、后面的步骤,直接点击finsh按钮(4)出现新工程信息对话框(new project information),说明了所创建的骨架工程的有关信息。如图所示。 2为对话框界面添加控件对象在创建了应用程序骨架之后,可以布置程序的主对话框。在mfc界面左方的工作区(workspace)中选择resourceview卡,从中选择dialog,双击idd_tc_dialog,右边会出现对话框,左边会出现控件面板,利用控件面板可以方便地在程序的主对话框界面中添加相应的可视控件对象,如图所示。 完成的对话框如图所示,然后按照表修改控件的属性。 控件类型控件idcaption静态文本 static texti

5、dc_static_servname服务器名称静态文本 static textidc_static_servport服务器端口静态文本 static textidc_static_msg消 息静态文本 static textidc_static_sent客户名编辑框 edit boxidc_edit_servname编辑框 edit boxidc_edit_servport编辑框 edit boxidc_edit_msg命令按钮 buttonidc_button_connect连接命令按钮 buttonidc_button_close断开命令按钮 buttonidok发送列表框 listbox

6、idc_list_sent列表框 listboxidc_list_received3为对话框中的控件对象定义相应的成员变量在窗口菜单中点查看/建立类向导,进入类向导(class wizard)对话框,如图。 选择成员变量卡(member variables),用类向导为对话框中的控件对象定义相应的成员变量。确认class name是ctcdlg,在左边的列表框中选择一个控件,然后点“add variable”按钮,会弹出”add member variable”对话框,如图所示,然后按照表输入即可。 客户端程序对话框中的控件对象对应的成员变量 控件idcontrol ids变量名称member

7、 variable name变量类别category变量类型variable typeidc_button_connectm_btnconnectcontrolcbuttonidc_edit_servnamem_strservnamevaluecstringidc_edit_servportm_strservportvalueintidc_edit_msgm_strmsgvaluecstringidc_list_sentm_listsentcontrolclistboxidc_list_receivedm_listrecetvedcontrolclistbox4创建从casyncsocket类

8、继承的派生类(1)为了能够捕获并响应socket事件,应创建用户自己的套接字类,它应当从casyncsocket类派生,还能将套接字事件传递给对话框,以便执行用户自己的事件处理函数。选择菜单“插入/新建类”,进入“new class”对话框,如图所示。 选择或输入以下信息:class type:选择mfc classclass infoumation下的name: 输入ccsocketclass infoumation下的base class:选择casyncsocket点击“ok”按钮,系统会自动生成ccsocket类对应的包含文件csocket.h和csocket.cpp文件,在vc界面的

9、class view中就可以看到这个类。 (2)利用类向导classwizard为这个套接字类添加响应消息的事件处理成员函数。点菜单view/classwizard.,进入类向导对话框,选择message maps(消息映射)卡,确认class name是ccsocket,从messages(消息)栏中选择事件消息,然后点击add function按钮,就会看到在member function栏中添加了相应的事件处理函数。如图5.13所示,此程序中需要添加onconnect,onclose和onreceive三个函数。这一步会在ccsocket类的csocket.h中自动生成这些函数的声明,在

10、csocket.cpp中生成这些函数的框架,以及消息映射的相关代码。(3)为套接字类添加一般的成员函数和成员变量在vc+的界面中,在工作区窗口选择classview卡,用右键单击ccsocket类,会弹出快捷菜单,选择其中的add member function 可以为该类添加成员函数;选择add member variable可以为该类添加成员变量。如图所示。(4)手工添加其他代码在vc+的界面中,在工作区窗口选择fileview卡,双击要编辑的文件,在右面的窗口中就会展示该文件的代码,可以编辑添加。对于csocket.h,应在文件开头,添加对于此应用程序对话框类的声明。class ctcd

11、lg;5手工添加的代码在ctcdlg对话框类的tcdlg.h中添加对于csocket.h的包含命令,来获得对于套接字支持: #include “csocket.h”在ctcdlg对话框类的tcdlg.cpp中添加对于控件变量的初始化代码:/ todo: add extra initialization here/用户添加的控件变量的初始化代码bool ctcdlg:oninitdialog()m_strservname=localhost; / 服务器名 = localhostm_nservport=1000; / 服务端口 = 1000updatedata(false); / 更新用户界面/

12、设置套接字类的对话框指针成员变量m_sconnectsocket.setparent(this); 6添加事件函数和成员函数的代码主要在ctcdlg对话框类的tcdlg.cpp中和ccsocket类的csocket.cpp中,添加用户自己的事件函数和成员函数的代码,要注意,这些函数的框架已经在前面的步骤中,由vc+的向导生成,只要将用户自己的代码填入其中即可。7进行测试。测试应分步进行,在上面的步骤中,每作一步,都可以试着编译执行。创建服务器端应用程序1使用mfc appwizard创建服务器端应用程序框架。2为对话框界面添加控件对象3为对话框中的控件对象定义相应的成员变量4创建从casync

13、socket类继承的派生类5手工添加的代码6添加事件函数和成员函数的代码7进行测试。 客户端程序的主要功能的代码和分析1应用程序类ctsapp对应的文件ts.h和ts.cpp。2类ccsocket对应的文件csocket.h头文件和csocket.cpp文件。3.cmsg类对应的文件msg.h头文件和msg.cpp文件。4.clsocket对应的文件lsocket.h和lsocket.cpp5对话框类ctcdlg对应的文件对话框类cttcdlg,对应的文件是tcdlg.h和tcdlg.cpp。6其他文件对于vc+为tc工程创建的其他文件,如stdafx.h和stdafx.cpp,以及resou

14、rce.h和tc.rc都不需要作任何处理。 服务器端程序:csocket.cpp/ csocket.cpp: implementation of the ccsocket class./#include stdafx.h#include ts.h#include csocket.h#include tsdlg.h#include msg.h#ifdef _debug#undef this_filestatic char this_file=_file_;#define new debug_new#endif/ construction/destruction/构造函数ccsocket:ccso

15、cket(ctsdlg* pdlg)m_pdlg = pdlg;m_pfile = null;m_parchivein = null;m_parchiveout = null;/析构函数ccsocket:ccsocket()m_pdlg = null;if (m_parchiveout != null) delete m_parchiveout;if (m_parchivein != null) delete m_parchivein;if (m_pfile != null) delete m_pfile;/初始化void ccsocket:initialize()/构造与此套接字相应的cso

16、cketfile对象m_pfile=new csocketfile(this,true);/构造与此套接字相应的carchive对象m_parchivein=new carchive(m_pfile,carchive:load);m_parchiveout=new carchive(m_pfile,carchive:store);/发送消息void ccsocket:sendmessage(cmsg* pmsg)if (m_parchiveout != null)/调用消息类的序列化函数,发送消息pmsg-serialize(*m_parchiveout);/将carchive对象中的数据强制

17、性写入csocketfile文件中m_parchiveout-flush();/接收消息void ccsocket:receivemessage(cmsg* pmsg)/调用消息类的序列化函数,接收消息pmsg-serialize(*m_parchivein);/onreceive事件处理函数,当套接字收到数据时,激发此事件void ccsocket:onreceive(int nerrorcode) csocket:onreceive(nerrorcode);/调用主对话框类中的相应函数来处理m_pdlg-onreceive(this);implement_dynamic(ccsocket,

18、csocket)csocket.h/ csocket.h: interface for the ccsocket class./#if !defined(afx_csocket_h_included_)#define afx_csocket_h_included_class ctsdlg;class cmsg;/用于建立连接和传送接收信息的客户套接字类定义class ccsocket : public csocket declare_dynamic(ccsocket);/constructionpublic:ccsocket(ctsdlg* pdlg); /构造函数virtual ccsock

19、et(); /析构函数/attributespublic:ctsdlg* m_pdlg; /主对话框类指针变量csocketfile* m_pfile; /csocketfile对象的指针变量carchive* m_parchivein; /用于输入的carchive对象的指针变量carchive* m_parchiveout;/用于输出的carchive对象的指针变量/operationspublic:void initialize(); /初始化void sendmessage(cmsg* pmsg); /发送消息void receivemessage(cmsg* pmsg); /接收消息

20、/overridable callbacks/可重载的回调函数,当套接字收到数据时,自动调用此函数protected:virtual void onreceive(int nerrorcode);#endif / !defined(afx_csocket_h_included_)lsocket.cpp/ lsocket.cpp: implementation of the clsocket class./#include stdafx.h#include ts.h#include lsocket.h#include tsdlg.h#ifdef _debug#undef this_filesta

21、tic char this_file=_file_;#define new debug_new#endif/ construction/destruction/clsocket:clsocket(ctsdlg* pdlg)m_pdlg = pdlg; /对成员变量赋值clsocket:clsocket()m_pdlg = null;/onaccept事件处理函数void clsocket:onaccept(int nerrorcode) csocket:onaccept(nerrorcode);m_pdlg-onaccept(); /调用主对话框类中的相应函数implement_dynamic

22、(clsocket,csocket)lsocket.h/ lsocket.h: interface for the clsocket class./#if !defined(afx_lsocket_h_included_)#define afx_lsocket_h_included_class ctsdlg;/专用于监听客户端连接请求的侦听套接字类定义class clsocket : public csocket declare_dynamic(clsocket);/constructionpublic:clsocket(ctsdlg* pdlg);virtual clsocket();/ a

23、ttributespublic:ctsdlg* m_pdlg; /成员变量/ overridable callbacks/可重载的回调函数,当套接字收到连接请求时,自动调用此函数protected:virtual void onaccept(int nerrorcode);#endif / !defined(afx_lsocket_h_included_)msg.cpp/ msg.cpp: implementation of the cmsg class./#include stdafx.h#include ts.h#include msg.h#ifdef _debug#undef this_

24、filestatic char this_file=_file_;#define new debug_new#endif/ construction/destruction/cmsg:cmsg()m_strtext = _t(); /初始化m_bclose=false;cmsg:cmsg()void cmsg:serialize(carchive& ar)if (ar.isstoring()ar(word)m_bclose;ar wd;m_bclose=(bool)wd;ar m_strtext;implement_dynamic(cmsg,cobject)msg.h/ msg.h: inte

25、rface for the cmsg class./#if !defined(afx_msg_h_included_)#define afx_msg_h_included_/消息类定义class cmsg : public cobject declare_dyncreate(cmsg);/constructionpublic:cmsg();virtual cmsg();/attributespublic:cstring m_strtext; /字符串成员bool m_bclose; /是否关闭状态/implementationpublic:virtual void serialize(carc

26、hive& ar); /序列化函数;#endif / !defined(afx_msg_h_included_)ts.cpp/ ts.cpp : defines the class behaviors for the application./#include stdafx.h#include ts.h#include tsdlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ ctsappbegin_message_map(ctsapp, cwinapp)/af

27、x_msg_map(ctsapp)/ note - the classwizard will add and remove mapping macros here./ do not edit what you see in these blocks of generated code!/afx_msgon_command(id_help, cwinapp:onhelp)end_message_map()/ ctsapp constructionctsapp:ctsapp()/ todo: add construction code here,/ place all significant in

28、itialization in initinstance/ the one and only ctsapp objectctsapp theapp;/ ctsapp initializationbool ctsapp:initinstance()if (!afxsocketinit()afxmessagebox(idp_sockets_init_failed);return false;afxenablecontrolcontainer();/ standard initialization/ if you are not using these features and wish to re

29、duce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _afxdllenable3dcontrols();/ call this when using mfc in a shared dll#elseenable3dcontrolsstatic();/ call this when linking to mfc statically#endifctsdlg dlg;m_pm

30、ainwnd = &dlg;int nresponse = dlg.domodal();if (nresponse = idok)/ todo: place code here to handle when the dialog is/ dismissed with okelse if (nresponse = idcancel)/ todo: place code here to handle when the dialog is/ dismissed with cancel/ since the dialog has been closed, return false so that we

31、 exit the/ application, rather than start the applications message pump.return false;ts.h/ ts.h : main header file for the ts application/#if !defined(afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_)#define afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_#if _msc_ver 1000#pragma once#

32、endif / _msc_ver 1000#ifndef _afxwin_h_#error include stdafx.h before including this file for pch#endif#include resource.h/ main symbols/ ctsapp:/ see ts.cpp for the implementation of this class/class ctsapp : public cwinapppublic:ctsapp();/ overrides/ classwizard generated virtual function override

33、s/afx_virtual(ctsapp)public:virtual bool initinstance();/afx_virtual/ implementation/afx_msg(ctsapp)/ note - the classwizard will add and remove member functions here./ do not edit what you see in these blocks of generated code !/afx_msgdeclare_message_map();/afx_insert_location/ microsoft visual c+

34、 will insert additional declarations immediately before the previous line.#endif / !defined(afx_ts_h_ff52aae4_fdc6_11d9_bc43_000795df7f99_included_)tsdlg.cpp/ tsdlg.cpp : implementation file/#include stdafx.h#include ts.h#include tsdlg.h#include msg.h#ifdef _debug#define new debug_new#undef this_fil

35、estatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass 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 dodataexcha

36、nge(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

37、_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ ctsdlg dialogctsdlg:ctsdlg(cwnd* pparent /*=null*/): cdialog(ctsdlg:idd, pparent)/afx_data_init(ctsdlg)m_nport = 0;/afx_data_init/ note that loadicon does not r

38、equire a subsequent destroyicon in win32m_hicon = afxgetapp()-loadicon(idr_mainframe);m_plsocket = null;void ctsdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(ctsdlg)ddx_control(pdx, idc_static_num, m_stanum);ddx_control(pdx, idok, m_btnclose);ddx_control(pdx, idc_li

39、st_msg, m_listmsg);ddx_control(pdx, idc_button_listen, m_btnlisten);ddx_text(pdx, idc_edit_port, m_nport);/afx_data_mapbegin_message_map(ctsdlg, cdialog)/afx_msg_map(ctsdlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_button_listen, onbuttonlisten)on_bn_clicked(idok, onclose

40、)/afx_msg_mapend_message_map()/ ctsdlg message handlersbool ctsdlg: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-appendm

41、enu(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 icon/ todo: add extra initialization herem_nport = 8000;updateda

42、ta(false);getdlgitem(idok)-enablewindow(false);return true; / return true unless you set the focus to a controlvoid ctsdlg:onsyscommand(uint nid, lparam lparam)if (nid & 0xfff0) = idm_aboutbox)caboutdlg dlgabout;dlgabout.domodal();elsecdialog:onsyscommand(nid, lparam);/ if you add a minimize button

43、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 ctsdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.gets

44、afehdc(), 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:onpai

45、nt();/ the system calls this to obtain the cursor to display while the user drags/ the minimized window.hcursor ctsdlg:onquerydragicon()return (hcursor) m_hicon;/以下的函数代码是由编程者添加的!/当单击“监听”按钮时,执行此函数,启动服务器端套接字的监听void ctsdlg:onbuttonlisten() updatedata(true); /获得用户输入/创建侦听套接字对象m_plsocket = new clsocket(this);/创建监听套接字的底层套接字,在用户指定的端口上侦听if (!m_plsocket-create(m_nport)delete m_plsocket; /错误处理m_pls

温馨提示

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

评论

0/150

提交评论