




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与技术学院20082009 学年第 2 学期计算机网络课程设计题目: 端口扫描实验 班级: 学号: 姓名: 教师: 成绩: 目 录1 需求分析31.1 课程设计目的31.2 课程设计内容31.3 课程设计要求32 概要设计32.1 原理概述32.2 运行环境32.3 基本设计思路32.4 功能模块设计33 详细设计33.1 程序流程33.2 主要算法53.3 主要数据结构63.4 主要函数说明64 用户使用手册75 项目分析与总结75.1 项目分析75.2 总结与建议8附录a 源程序代码文件说明8附录b 参考文献201. 需求分析1.1 课程设计目的 加深对tcp/ip的理解,熟悉socket编程。课程设计内容实现一个扫描器,使用tcp connect进行端口扫描,并把扫描到的结果记录下来。课程设计要求(1) windows或linux环境下,程序在单机上运行;(2) 使用端口扫描对一台主机进行扫描,并显示出结果;对一个网段进行ip扫描,显示出结果;(3) 提供友好的用户界面。2. 概要设计2.1 原理概述tcp connect扫描是最基本的扫描,操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。2.2 运行环境windows xp,vc+6.02.3 基本设计思路创建一个csocket套接字,通过csocket的connect函数测试该主机的某个端口是否能够连通,获得该端口的打开状态。2.4 功能模块设计(1)测试主机某个端口是否打开;(2)“扫描结果”标题栏;(3)扫描单个或多个端口的单选按钮;(4)“扫描”,“停止”,“保存”按钮。3.详细设计3.1 程序流程开始扫描初始化扫描单个端口?tm_bsingleport=true;m_csingleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnstop.enablewindow(false);fm_bsingleport=false;m_csingleport.enablewindow(false);m_cportfrom.enablewindow();m_cportto.enablewindow();m_cbtnstop.enablewindow(false);设置端口开始侦听端口有错误?显示结果ft设置下一端口扫描结束3.2 主要算法(1)测试主机某个端口是否打开的函数testconnection():bool cmydlg:testconnection(cstring ip,uint nport) csocket* psocket;psocket=new csocket;assert(psocket);if (!psocket-create() delete psocket;psocket=null;return false;while (!psocket-connect(ip,nport) delete psocket;psocket=null;return false;psocket-close();delete psocket;return true;(2)响应单选按钮“扫描单个端口”和“扫描多个端口”的单击消息:void cmydlg:onradio1single() m_bsingleport=true;m_csingleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnstop.enablewindow(false);void cmydlg:onradio2range() m_bsingleport=false;m_csingleport.enablewindow(false);m_cportfrom.enablewindow();m_cportto.enablewindow();m_cbtnstop.enablewindow(false);(3)显示列表框标题栏的成员函数:/增加列表框标题栏的某一列bool cmydlg:addcolumn(lpctstr stritem,int nitem,int nsubitem,int nmask,int nfmt) lv_column lvc;lvc.mask=nmask;lvc.fmt=nfmt;lvc.psztext=(lptstr) stritem;lvc.cx=m_cresult.getstringwidth(lvc.psztext)+25;if(nmask&lvcf_subitem) if(nsubitem!=-1)lvc.isubitem=nsubitem;elselvc.isubitem=nitem;return m_cresult.insertcolumn(nitem,&lvc);/在列表框中加一条bool cmydlg:additem(int nitem,int nsubitem,lpctstr stritem ,int nimageindex) lv_item lvitem;lvitem.mask=lvif_text;lvitem.iitem=nitem;lvitem.isubitem=nsubitem;lvitem.psztext=(lptstr)stritem;if(nimageindex!=-1) lvitem.mask|=lvif_image;lvitem.iimage|=lvif_image;if(nsubitem=0)return m_cresult.insertitem(&lvitem);return m_cresult.setitem(&lvitem);/加一列标题栏字符void cmydlg:addheader(lptstr hdr) if (m_pcolumns)m_pcolumns-addtail(hdr);/显示列表框标题栏void cmydlg:showheaders() int nindex=0;position pos=m_pcolumns-getheadposition();while(pos) cstring hdr=(cstring)m_pcolumns-getnext(pos);addcolumn(hdr,nindex+);(4)“扫描”,“停止”,“保存”按钮,见附录程序。3.3 主要数据结构及主要函数说明(1)测试主机某个端口是否打开testconnection函数;(2)“扫描结果”标题栏成员函数addheader,addcolumn,showheaders;在列表框中添加字符串的函数additem;(3)扫描单个或多个端口的单选按钮onradiosingle()和onradiorange();(4)“扫描”,“停止”,“保存”按钮onbutton1start(),onbutton2stop(),onbutton3save();4.用户使用手册输入要扫描的主机ip地址,选择“扫描单个端口”或“扫描多个端口”,若选择前者,则输入单个端口号;若选择后者,则输入端口范围。再输入扫描次数(默认值为1),单击“扫描”按钮,扫描结果列表框中将会显示所输入端口的扫描结果。单击“停止”时停在那一刻的状态,并显示已扫描的结果。单击“保存”时,可将结果保存在文本文件中。5.项目分析与总结5.1 项目分析扫描单个端口的结果:扫描多个端口:通过观察,主机ip为10.5.104.36的25号端口是打开的。5.2 总结与建议通过这次实验,加深了对端口的理解,也对socket编程有了进一步的认识。实验中遇到许多函数和定义需要上网查阅资料,而且调试的过程也比较困难,需要向同学请教。所以,今后在编程和查阅资料方面的能力有待于进一步去提高。附录a源程序代码文件说明:(1)端口扫描dlg.h:#if !defined(afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_)#define afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_#if _msc_ver 1000#pragma once#endif / _msc_ver 1000#include #include #include #include #include /扫描结果typedef struct int nattempts;tchar ipaddress16;tchar port5;bool bstatus; /1 = open , 0 = closedata;/ cmydlg dialogclass cmydlg : public cdialog/ constructionpublic:cmydlg(cwnd* pparent = null);/ standard constructor/ dialog data/afx_data(cmydlg)enum idd = idd_my_dialog ;cprogressctrlm_cprogress;clistctrlm_cresult;cipaddressctrlm_cip;ceditm_cattempts;ceditm_cportto;ceditm_cportfrom;ceditm_csingleport;cbuttonm_cbtnstop;cbuttonm_cbtnscan;/afx_data/ classwizard generated virtual function overrides/afx_virtual(cmydlg)protected:virtual void dodataexchange(cdataexchange* pdx);/ ddx/ddv support/afx_virtual/ implementationprotected:hicon m_hicon; bool testconnection(cstring ip, uint nport);/测试主机某个端口是否打开void showheaders(void);/显示列表框标题栏void addheader(lptstr hdr);/增加一列标题栏字符additem(int nitem,int nsubitem,lpctstr stritem,int nimageindex=-1);/向m_cresult输出一个结果/ 向输出结构列表控件增加一列bool addcolumn(lpctstr stritem,int nitem,int nsubitem=-1,int nmask=lvcf_fmt|lvcf_width|lvcf_text|lvcf_subitem,int nfmt=lvcfmt_left);/ 变量uint m_nmaxattempts;/试图连接次数的最大值bool m_bsingleport;/是否只扫描单个端口uint m_minport,m_maxport;/扫描端口的范围uint m_ncounter;/端口的个数cstringlist* m_pcolumns;/列表框标题栏cptrlist* m_pstatuslist;/保存扫描结果的链表/ generated message map functions/afx_msg(cmydlg)virtual bool oninitdialog();afx_msg void onsyscommand(uint nid, lparam lparam);afx_msg void onpaint();afx_msg hcursor onquerydragicon();afx_msg void onbutton1start();afx_msg void onbutton2stop();afx_msg void onbutton3save();afx_msg void onradio1single();afx_msg void onradio2range();/afx_msgdeclare_message_map();/afx_insert_location/ microsoft visual c+ will insert additional declarations immediately before the previous line.#endif / !defined(afx_dlg_h_37f5060c_6d8b_42f0_90d9_fba754bad52b_included_)(2)端口扫描dlg.cpp:#includestdafx.h#include端口扫描.h#include端口扫描dlg.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg dialog used for app aboutclass caboutdlg : public cdialog public: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()/ cmydlg dialogcmydlg:cmydlg(cwnd* pparent /*=null*/): cdialog(cmydlg:idd, pparent)/在对话框的构造函数中初始化成员变量/afx_data_init(cmydlg)/afx_data_init/ note that loadicon does not require a subsequent destroyicon in win32m_hicon = afxgetapp()-loadicon(idr_mainframe); m_pcolumns=new cstringlist; assert(m_pcolumns); m_bsingleport=true; m_nmaxattempts=1; m_pstatuslist=new cptrlist; assert(m_pstatuslist); void cmydlg:dodataexchange(cdataexchange* pdx) cdialog:dodataexchange(pdx);/afx_data_map(cmydlg)ddx_control(pdx, idc_progress1, m_cprogress);ddx_control(pdx, idc_list1, m_cresult);ddx_control(pdx, idc_ipaddress1, m_cip);ddx_control(pdx, idc_edit4_attempts, m_cattempts);ddx_control(pdx, idc_edit3_single_port_to, m_cportto);ddx_control(pdx, idc_edit2_single_port_from, m_cportfrom);ddx_control(pdx, idc_edit1_single_port, m_csingleport);ddx_control(pdx, idc_button2_stop, m_cbtnstop);ddx_control(pdx, idc_button1_start, m_cbtnscan);/afx_data_mapbegin_message_map(cmydlg, cdialog)/afx_msg_map(cmydlg)on_wm_syscommand()on_wm_paint()on_wm_querydragicon()on_bn_clicked(idc_button1_start, onbutton1start)on_bn_clicked(idc_button2_stop, onbutton2stop)on_bn_clicked(idc_button3_save, onbutton3save)on_bn_clicked(idc_radio1_single, onradio1single)on_bn_clicked(idc_radio2_range, onradio2range)/afx_msg_mapend_message_map()/ cmydlg message handlersbool cmydlg: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 icon/ todo: add extra initialization here/给列表框加标题栏 addheader(_t(ip地址); / 加一列标题栏字符 addheader(_t(端口号); addheader(_t(端口状态); addheader(_t(尝试连接次数); addheader(_t(标记); showheaders(); /设置扫描单个端口 checkradiobutton(idc_radio1_single,idc_radio2_range,idc_radio1_single); /设置控件的默认状态 m_csingleport.enablewindow();m_cportfrom.enablewindow(false); m_cportto.enablewindow(false); m_cbtnstop.enablewindow(false); m_cattempts.setwindowtext(_t(1);return true; / return true unless you set the focus to a controlvoid cmydlg:onsyscommand(uint nid, lparam lparam) if (nid & 0xfff0) = idm_aboutbox) caboutdlg dlgabout;dlgabout.domodal();else cdialog: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 cmydlg: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 cmydlg:onquerydragicon() return (hcursor) m_hicon;void cmydlg:onbutton1start() /“扫描”按钮 / todo: add your control notification handler code herecstring btntxt,ip;uint nsingleport;byte f1,f2,f3,f4;tchar temp10=0; m_cprogress.setpos(0); m_cresult.deleteallitems(); position p=m_pstatuslist-getheadposition(); while(p) position temp=p; data* pnode=(data*)m_pstatuslist-getnext(p); m_pstatuslist-removeat(temp); if (pnode)/pnode!=null delete pnode; if(m_cip.isblank() messagebox(请输入主机ip地址); return; if(m_cip.getaddress(f1,f2,f3,f4)4) messagebox(请输入有效的ip地址); return; ip=_itoa(f1,temp,10); ip+=_t(.); ip+=_itoa(f2,temp,10); ip+=_t(.); ip+=_itoa(f3,temp,10); ip+=_t(.); ip+=_itoa(f4,temp,10); m_cbtnstop.enablewindow(); m_cbtnscan.enablewindow(false); if(m_bsingleport) cstring port; m_csingleport.getwindowtext(port); m_minport=m_maxport=nsingleport=atoi(port); else cstring port1,port2; m_cportfrom.getwindowtext(port1); m_cportto.getwindowtext(port2); m_minport=atoi(port1); m_maxport=atoi(port2); m_cprogress.setrange32(0,m_maxport-m_minport+1); m_cprogress.setstep(1); if (!m_bsingleport&m_maxportm_minport) messagebox(_t(您输入的端口范围有误,请重新输入); return; uint m_nmaxattempts=getdlgitemint(idc_edit4_attempts); for(m_ncounter=m_minport;m_ncounter=m_maxport;m_ncounter+) bool bisopen=false; uint nattempt=1; while(nattemptsetwindowtext(str); str.empty(); bisopen=testconnection(ip,m_ncounter); if(bisopen) data* pnode=new data; assert(pnode); strcpy(pnode-ipaddress,ip.getbuffer(ip.getlength(); strcpy(pnode-port,_itoa(m_ncounter,temp,10); pnode-bstatus = 1; /open pnode-nattempts=nattempt; m_pstatuslist-addtail(pnode); nattempt+; if (!bisopen) data* pnode=new data; assert(pnode); strcpy(pnode-ipaddress,ip.getbuffer(ip.getlength(); strcpy(pnode-port,_itoa(m_ncounter,temp,10); pnode-bstatus=0; /close pnode-nattempts=nattempt-1; m_pstatuslist-addtail(pnode); msg message; if (:peekmessage(&message,null,0,0,pm_remove) :translatemessage(&message); :dispatchmessage(&message); m_cprogress.stepit(); cstatic* pstatic=(cstatic*)getdlgitem(idc_static_status); pstatic-setwindowtext(cstring)_t(当前扫描状态); m_cbtnscan.enablewindow(); m_cbtnstop.enablewindow(false); uint nindex=0; position pos=m_pstatuslist-getheadposition(); while(pos) data* pnode=(data*)m_pstatuslist-getnext(pos); additem(nindex,0,pnode-ipaddress); additem(nindex,1,pnode-port); if (pnode-bstatus) additem(nindex,2,_t(open); additem(nindex,4,_t(*); else additem(nindex,2,_t(close); additem(nindex,4,_t( ); additem(nindex+,3,_itoa(pnode-nattempts,temp,10); void cmydlg:onbutton2stop() /“停止”按钮 / todo: add your control notification handler code herem_ncounter=m_maxport+1;m_cbtnstop.enablewindow(false);m_cbtnscan.enablewindow();cstatic* pstatic=(cstatic*)getdlgitem(idc_static_status);pstatic-setwindowtext(cstring)_t(当前扫描状态);void cmydlg:onbutton3save() /“保存”按钮/ todo: add your control notification handler code herecfiledialog* pdlg=new cfiledialog(false,_t(txt),null,ofn_overwriteprompt | ofn_explorer | ofn_longnames,_t(scanned ports files (*.txt),this);assert(pdlg);if (pdlg-domodal()=idok)int nhandle,retval;nhandle=_open(pdlg-getpathname(),_o_binary|_o_creat|_o_trunc|_o_rdwr);if (nhandle=-1)messagebox(_t(unable to open output file to write.),_t(error),mb_ok|mb_iconexclamation);delete pdlg;return;position pos=m_pstatuslist-getheadposition();while(pos)cstring buffer;data* pnode=(data*)m_pstatuslist-getnext(pos);buffer=pnode-ipaddress;buffer+=_t(,);buffer+=pnode-port;buffer+=_t(,);if (pnode-bstatus)buffer+=_t(open);elsebuffer+=_t(close);buffer+=_t(rn0);retval=_write(nhandle,(void*)buffer.getbuffer(buffer.getlength(), buffer.getlength();if (retval!=buffer.getlength()messagebox(_t(an error occured while writing records.),_t(error),mb_ok | mb_iconexclamation);delete pdlg;return;buffer.empty();_close(nhandle);delete pdlg;void cmydlg:onradio1single() / todo: add your control notification handler code herem_bsingleport=true;m_csingleport.enablewindow();m_cportfrom.enablewindow(false);m_cportto.enablewindow(false);m_cbtnstop.enablewindow(false);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 空管语音通信系统、记录仪机务员国庆节后复工安全考核试卷含答案
- 铝电解工节假日前安全考核试卷含答案
- 皮具设计师节假日前安全考核试卷含答案
- 物业管理安全风险控制方案
- 高校学生课堂出勤管理办法
- 节能减排方案及实施效果评估
- 制造企业环境保护与污染防治管理
- 超市班组长日常管理工作计划
- 2025-2030动物保健领域药用饲料政策环境与合规经营策略研究
- 2025-2030动力锂电池隔膜材料技术迭代与产能布局优化报告
- 围手术期病人管理
- 垃圾中转站运营管理项目整体服务方案
- 血常规报告单
- 《昆山反杀案》课件
- 电路检查记录表
- 前牙黑三角的树脂充填
- 华为质量管理评估模型(31个评估要素和评估报告)
- 模具凸凹模工艺文件工序卡
- 储备店长培训工作流程-课件
- 药品效期管理
- GB 42590-2023民用无人驾驶航空器系统安全要求
评论
0/150
提交评论