网络安全实训报告.doc_第1页
网络安全实训报告.doc_第2页
网络安全实训报告.doc_第3页
网络安全实训报告.doc_第4页
网络安全实训报告.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

网络安全实训报告重庆科技学院学生实习(实训)总结报告院(系):XX 专业班级:_XX 学生姓名:_XX_ 学号:_XX _ 实习(实训)地点:_ XX_ _ 报告题目:_ 网络安全实训 报告日期: 2013年 10月 18 日 指导教师评语: _ _ 成绩(五级记分制):_ _ 指导教师(签字):_前言随着计算机技术在社会各个层次的普及其影响力已经渗透到了人们生活的方方面面。网络技术作为与计算机技术相伴而生的产物,已经逐渐开始为人们所认识和重视。本次实训目的是通过该实训使人们深入认识网络安全技术的基本概念、原理和技术,掌握基本的网络安全攻防技术,常用数据加密方法及入侵检测的原理和方法。加深对网络安全技术的理解。培养实践技能、动手能力和分析问题、解决问题的能力。掌握和理解网络安全领域各个知识点的精髓,培养人们构建安全网络系统的思路和方法,树立安全防范意识。实训内容是掌握简单网络套接字的安全编程,了解网络套接字编程的基本知识;掌握网络多线程的同步编程,掌握进程间实现同步到安全编程技术。掌握网络通信软件设计的基本方法,设计一个简单安全的浏览器、Ftp服务器等。目录第一章 Socket套接字编程31.1 socket编程原理31.2 客户/服务器模式41.3 Socket编程流程51.4 聊天协议61.5 TCP客户端程序61.5.1创建工程61.5.2界面设计71.5.3界面初始化71.5.4 功能实现91.6 TCP服务器程序121.6.1创建工程121.6.2界面设计121.6.3界面初始化131.6.4 功能实现16第2章 网络多线程同步编程252.1 多线程原理252.2 线程同步概述252.3 客户端程序262.3.1创建工程262.3.2界面设计262.3.3界面初始化262.3.4 功能实现282.4 TCP服务器程序322.4.1创建工程322.4.2界面设计322.4.3界面初始化322.4.4 功能实现33第3章 网页浏览器393.1 网页浏览器概述393.2 Get与Post请求方式393.3 Http响应393.4 CHtmlView类403.5 系统功能403.5.1 网页显示与导航403.5.2 地址栏423.5.3 保存网页433.5.4搜索引擎443.5.5超连接页面443.6 程序主要代码45总结48参考文献49第一章 Socket套接字编程1.1 socket编程原理 Socket通常也称为“套接字”,套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个 网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数 据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。 套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套接字有两种不同的类型:流套接字和数据报套接字。 (1)流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的TCP服务应用; (2)数据报式套接字(SOCK_DGRAM):一种无连接的Socket,对应于无连接的UDP服务应用。 从用户的角度来看,SOCK_STREAM、SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的全部,因为基于TCP/IP的应用,从 协议栈的层次上讲,在传输层的确只可能建立于TCP或UDP协议之上,而SOCK_STREAM、SOCK_DGRAM又分别对应于TCP和UDP,所以 几乎所有的应用都可以用这两类套接字实现。 在实际生活中,人们所使用的网络通讯软件功能均是基于Socket套接字作为通信桥梁实现。所以,套接字在网络编程中,有着非常重要的作用。WinSock是TCP/IP编程最低级的Windows API,其代码的一部分位于Winsock32.dll中,另一部分位于Windows核心,使用Windows API可以编写Internet 服务器和客户端程序。应用程序调用Windows Socket 的API实现相互之间的通信。图1.1 应用程序与Windows Socket关系图1.2 客户/服务器模式 在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基本客户/服务器模式的TCP/IP。 客户/服务器模式服务运用过程中采取的是主动请求方式: 首先服务器方要先启动,并根据请求提供相应服务: 1)打开一通信通道并告知本地主机,它愿意在某一公认地址上(周知口,如FTP为21)接收客户请求; 2)等待客户请求到达该端口; 3)接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 4)返回第二步,等待另一客户请求。 5)关闭服务器 客户方: 1)打开一通信通道,并连接到服务器所在主机的特定端口; 2)向服务器发服务请求报文,等待并接收应答;继续提出请求. 3)请求结束后关闭通信通道并终止。 基于TCP的C/S网络通信流程图: 图1.2 C/S流程图1.3 Socket编程流程MFC中的CSocket类以及使用CSocket类编程的基本流程。1)创建套接字 2)绑定地址信息3)连接服务器 4) 数据交换5) 关闭套接字对象1.4 聊天协议在聊天协议中的每个聊天命令都是应答方式的,即客户端发送聊天命令后会接收到一个应答消息。定义OK和ERROR两种应答,客户端收到OK应答时,表示前面的聊天命令执行成功;收到ERROR应答时,表示前面发送的聊天命令执行失败。在整个聊天室的聊天过程中,客户端包含closed和connected两种状态。当执行CONNECTED命令后就进入了connected状态,只有在这个状态下才可以继续进行聊天。在执行QUIT命令后,聊天状态会变成closed状态,此时客户端只能执行CONNECT命令再次登录聊天室服务器。CONNECT用于连接聊天室服务器。当聊天室客户端与聊天室服务器建立Socket连接后,会马上发送CONNECT命令。JOIN用于通知其他用户本人已经加入聊天室服务器。当一个用户登录到聊天室服务器后,服务器会发送JOIN命令通知每个聊天室客户端有新用户加入。LIST命令用于向聊天室客户端发送全部的登录用户的用户名。EXIT命令是客户端发送给聊天室服务器的,表示当前用户要退出聊天室。1.5 TCP客户端程序C/S聊天室工具提供了最基本的聊天功能,如聊天、用户列表维护等。根据聊天室的实际需要分析,一个聊天室主要由聊天室服务器端和聊天室客户端组成。聊天室客户端主要是用于和用户交互的。1.5.1创建工程在VC中创建一个基于MFC的应用程序工程,并且将该工程名修改为“客户端程序”。1.5.2界面设计当工程创建以后,用户可以打开资源管理器查看该工程的对话框资源。用户可以通过向该对话框面板中添加相应的控件,以达到客户端程序的基本功能。1.5.3界面初始化客户端程序启动时,应该首先连接服务器以后,用户才能通过程序发送信息。所以,该程序初始化时的界面,如图.所示。图1.3程序初始化界面在界面初始化时,已经屏蔽了发送信息的功能。所以对于应用程序而言,避免了错误的发生。初始化代码如下:BOOL CTCPDlg: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/GetDlgItem(IDC_TEXT)-EnableWindow(false);禁用消息显示框GetDlgItem(IDC_SENDTEXT)-EnableWindow(false);禁用发送消息编辑框GetDlgItem(IDC_SEND)-EnableWindow(false);禁用发送消息按钮 GetDlgItem(IDC_B_out)-EnableWindow(false);s=:socket(AF_INET,SOCK_STREAM,0);: WSAAsyncSelect(s,this-m_hWnd,WM_SOCKET, FD_READ); GetDlgItem(IDC_ADDR)-SetWindowText(1);GetDlgItem(IDC_PORT)-SetWindowText(80); return TRUE; / return TRUE unless you set the focus to a control用户使用函数GetDlgItem()获取对应ID控件的指针,然后使用该指针调用函数EnableWindow()将控件禁用。函数EnableWindow()的参数如果为true,则表示该控件可以被使用。若为false,则禁用。 在界面初始化时,除了初始化界面中的各按钮之外,还应该对套接字进行初始化。初始化套接字功能的代码应该在函数CTCPDlg:OnInitDialog()中实现。代码如下:class CTCPDlg : public CDialog /类声明public:CTCPDlg(CWnd* pParent = NULL);/ standard constructorSOCKET s; /定义套接字对象sockaddr_in addr; /定义套接字地址结构变量protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV supportprotected:HICON m_hIcon;DECLARE_MESSAGE_MAP();1.5.4 功能实现 用户可以为各个功能控件编写相应的代码,以实现其功能。 “连接”按钮函数代码:void CTCPDlg:OnConnect() CString str,str1; /定义字符串 int port; /定义端口变量 GetDlgItem(IDC_ADDR)-GetWindowText(str);/获取服务器地址 GetDlgItem(IDC_PORT)-GetWindowText(str1);/获取端口号 if(str=|str1=)/判断用户输入是否为NULL MessageBox(服务器地址或端口不能为NULL);/显示提示信息 else port=atoi(str1.GetBuffer(1);/将端口字符串转换为数字 addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=inet_addr(str.GetBuffer(1);/转换服务器IP地址 addr.sin_port=ntohs(port); GetDlgItem(IDC_TEXT)-SetWindowText(正在连接服务器.rn);/提示用户正在连接服务器 if(:connect(s,(sockaddr*)&addr,sizeof(addr)!=0)/连接服务器 GetDlgItem(IDC_TEXT)-GetWindowText(str);/显示提示信息 str+=连接服务器成功!rn; GetDlgItem(IDC_TEXT)-SetWindowText(str); GetDlgItem(IDC_SENDTEXT)-EnableWindow(true);/设置控件的显示状态 GetDlgItem(IDC_CONNECT)-EnableWindow(false); GetDlgItem(IDC_SEND)-EnableWindow(true); GetDlgItem(IDC_ADDR)-EnableWindow(false); GetDlgItem(IDC_PORT)-EnableWindow(false); GetDlgItem(IDC_B_out)-EnableWindow(true); else/连接失败 GetDlgItem(IDC_TEXT)-GetWindowText(str); str+=连接服务器失败!请重试rn;GetDlgItem(IDC_TEXT)-SetWindowText(str); 将上面代码保存后运行,其结果如下所示;图1.4 客户端连接成功 当客户端与服务器连接成功后,用户便可发生消息到服务器,当消息为空时,在信息显示框中会出现“消息不能为空”。“发送“按钮相关函数代码如下:void CTCPDlg:OnSend() CString str,str1;GetDlgItem(IDC_SENDTEXT)-GetWindowText(str);/获取用户发送的消息字符串if(str=)/不允许用户发送空消息GetDlgItem(IDC_TEXT)-GetWindowText(str1);/获取信息框中的内容str1+=rn“;/添加回车换行符str1+=“消息不能为空rn;GetDlgItem(IDC_TEXT)-SetWindowText(str1);设置信息框中的内容else:send(s,str.GetBuffer(1),strlen(str),0);发送信息到指定服务器GetDlgItem(IDC_TEXT)-GetWindowText(str1);获取信息框中的内容在代码中,用户通过调用函数send()将消息发送到指定的服务器,并将该消息显示在本机的信息显示框中。作为客户端,还应具有接受并显示服务器所发送的消息。此次采用的是异步套接字模式实现该功能。在VC+中,将套接字设置为异步模式,调用函数WSAAsyncSelect()实现。该函数原型如下:Int WSAAsyncSelect(SOCKET S,HWND hWnd,Unsigned int wMsg,Long LEvent);自定义消息响应函数OnSocket(),实现套接字事件的处理。代码如下:void CTCPDlg:OnSocket(WPARAM wParam,LPARAM lParam)char cs4096=0;/定义数据缓冲区if(lParam=FD_READ)/如果是套接字读取时间CString num=;/定义字符串变量recv(s,cs,4096,0);/接受数据GetDlgItem(IDC_TEXT)-GetWindowText(num);/获取消息框中的内容num+=rn ;num+=(LPTSTR)cs;/将接受到的数据转换成字符串 GetDlgItem(IDC_TEXT)-SetWindowText(num);/设置消息框内容客户端接受服务器端消息示意图如下:图1.5 客户端接受服务器端消息1.6 TCP服务器程序聊天室的服务器端是聊天室最重要的一部分,是聊天室的主体,所以首先创建聊天室服务器。服务器端建立完成后,服务器端处于监听状态,等待客户端的连接请求1.6.1创建工程在VC中创建一个基于MFC的应用程序工程,并且将该工程名修改为“服务器程序”。1.6.2界面设计当工程创建以后,用户可以打开资源管理器查看该工程的对话框资源。为了完成服务器的基本功能,用户可以通过向该对话框面板中添加如表1.1所示的相应控件,并调整其位置与大小。表1.1 服务器相应控件用户将表1.1中所示控件添加到对话框面板中后,应调整各个控件以达到界面的美化。运行后服务器初始界面效果图如下所示:图1.6 服务器初始界面效果图1.6.3界面初始化与客户端程序启动时一样,服务器程序启动时也需要界面初始化。不过,服务器界面在初始化时,还应该同时完成套接字的创建以及地址绑定等处理工作。首先,定义套接字相关变量。代码如下:class CTCPDlg : public CDialog/ Constructionpublic:CTCPDlg(CWnd* pParent = NULL);/ standard constructorSOCKET s,s1; /定义套接字句柄sockaddr_in addr,add1;/定义套接字地址结构变量CString str,str1;int number; INFO ON_lineCon_num;/ Dialog Data/AFX_DATA(CTCPDlg)enum IDD = IDD_TCP_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CTCPDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnSocket(WPARAM wParam,LPARAM lParam);afx_msg void OnSend();/AFX_MSGDECLARE_MESSAGE_MAP();然后,在对话框初始化函数中创建套接字并且将套接字绑定到本地地址。代码如下:BOOL CTCPDlg: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 hereaddr.sin_family=AF_INET;addr.sin_port=htons(80);addr.sin_addr.S_un.S_addr=INADDR_ANY;s=:socket(AF_INET,SOCK_STREAM,0); :bind(s,(sockaddr*)&addr,sizeof(addr);:listen(s,Con_num);:WSAAsyncSelect(s,this-m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);/GetDlgItem(IDC_TEXT)-EnableWindow(false);GetDlgItem(IDC_SENDTEXT)-SetWindowText(客户端,你好!);CString s_num=0;s_num+=number;GetDlgItem(IDC_ONNUM)-SetWindowText(s_num)CString str14,str15;char *name15; :gethostname(char*)&name,(int)sizeof(name);/获得主机名字 hostent *p=:gethostbyname(char*)&name); in_addr *a=(in_addr*)*p-h_addr_list;/ 获得本机IP地址 str14=:inet_ntoa(a0); str15+=服务器已启动 本机IP地址:;/需要修改,获得IP地址 str15+=str14; GetDlgItem(IDC_ADDR)-SetWindowText(str15);GetDlgItem(IDC_TEXT)-SetWindowText(等待客户端的连接!rn);number=0;for(int i=0;iCon_num;i+)ON_linei.tt=false;return TRUE; / return TRUE unless you set the focus to a control1.6.4 功能实现TCP服务器应该具有监听、发送和接受数据的功能。首先,用户应该为程序添加监听功能。因为,服务器必须等待客户端的连接请求到来之后,才能实现接受和发送数据。将服务器创建的套接字设置为异步模式,并将套接字事件设置为连接和读取事件。代码如下:#define WM_SOCKET WM_USER+10/自定义套接字消息class CTCPDlg : public CDialog/ Constructionpublic:CTCPDlg(CWnd* pParent = NULL);/ standard constructorSOCKET s,s1; sockaddr_in addr,add1;CString str,str1;int number; INFO ON_lineCon_num;/ Dialog Data/AFX_DATA(CTCPDlg)enum IDD = IDD_TCP_DIALOG ;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CTCPDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CTCPDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnSocket(WPARAM wParam,LPARAM lParam);/自定义消息响应函数afx_msg void OnSend();/AFX_MSGDECLARE_MESSAGE_MAP();BOOL CTCPDlg: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 hereaddr.sin_family=AF_INET;/填充套接字地址结构addr.sin_port=htons(80);addr.sin_addr.S_un.S_addr=INADDR_ANY;s=:socket(AF_INET,SOCK_STREAM,0); :bind(s,(sockaddr*)&addr,sizeof(addr);/绑定本地地址:listen(s,Con_num);/监听端口:WSAAsyncSelect(s,this-m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ);/设置异步套接字/GetDlgItem(IDC_TEXT)-EnableWindow(false);GetDlgItem(IDC_SENDTEXT)-SetWindowText(客户端,你好!);CString s_num=0;s_num+=number;GetDlgItem(IDC_ONNUM)-SetWindowText(s_num);CString str14,str15;char *name15; :gethostname(char*)&name,(int)sizeof(name);/获得主机名字 hostent *p=:gethostbyname(char*)&name); in_addr *a=(in_addr*)*p-h_addr_list;/ 获得本机IP地址 str14=:inet_ntoa(a0); str15+=服务器已启动 本机IP地址:;/需要修改,获得IP地址 str15+=str14; GetDlgItem(IDC_ADDR)-SetWindowText(str15);GetDlgItem(IDC_TEXT)-SetWindowText(等待客户端的连接!rn);number=0;for(int i=0;iGetWindowText(s_temp);int lenth=sizeof(add1); s1=:accept(s,(sockaddr*)&add1,&lenth); for(int j=0;jCon_num;j+)if(ON_linej.tt&(ON_linej.add.sin_addr.S_un.S_addr=add1.sin_addr.S_un.S_addr) CString s_error=该客户已经登录了;send(s1,s_error,strlen(s_error),0);/通过IP 判断客户端是否连接 closesocket(s1); return ; for(int i=0;iSetWindowText(s_num);str13+=rn;str13.Format(有 %d 个客户已经连接上了,number);str13+=rn;str13+=:inet_ntoa(add1.sin_addr);str13+=登陆rn;GetDlgItem(IDC_TEXT)-SetWindowText(s_temp+str13);break; case FD_READ: CString s_temp=;GetDlgItem(IDC_TEXT)-GetWindowText(s_temp);for(int j=0;jSetWindowText(s_num);ON_linej.tt=false;closesocket(ON_linej.sock);s_temp+=rn; s_temp+=(LPTSTR):inet_ntoa(ON_linej.add.sin_addr);s_temp+= 断开服务器 ; GetDlgItem(IDC_TEXT)-SetWindowText(s_temp);CString send_s; send_s+=(LPTSTR):inet_ntoa(ON_linej.add.sin_addr); send_s+= : 退出了服务器; for(int i=0;iSetWindowText(s_temp);CString send_s;send_s+=(LPTSTR):inet_ntoa(add1.sin_addr);send_s+= : ;send_s+=(LPTSTR)buff; CStdioFile myFile, File; /创建 File.Open(filename.txt), CFile:modeWrite | CFile:modeCreate); File.WriteString(s_

温馨提示

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

评论

0/150

提交评论