计算机网络实验实验报告

合集下载

计算机网络实验教程实验报告

计算机网络实验教程实验报告

计算机网络实验教程实验报告一、实验目的本次计算机网络实验的主要目的是通过实际操作和观察,深入理解计算机网络的基本原理和技术,提高对网络配置、通信协议、网络服务等方面的实践能力,培养解决网络问题的思维和方法。

二、实验环境1、硬件环境实验中使用了若干台个人计算机,其配置包括:处理器_____、内存_____、硬盘_____等。

2、软件环境操作系统:Windows 10 专业版网络模拟软件:Packet Tracer网络测试工具:Ping、Tracert 等三、实验内容与步骤实验一:网络拓扑结构的搭建1、打开 Packet Tracer 软件,选择合适的网络设备,如路由器、交换机、PC 等。

2、按照设计好的网络拓扑结构,将设备进行连接。

本次实验构建了一个包含两个局域网通过路由器互联的简单网络。

3、为各设备配置 IP 地址、子网掩码、网关等网络参数。

实验二:网络通信协议的分析1、在搭建好的网络中,选择两台 PC 进行通信。

2、使用 Ping 命令测试网络的连通性,并观察返回的结果。

3、利用 Wireshark 抓包工具捕获通信过程中的数据包,分析其中的协议字段,如 IP 头、TCP 头、UDP 头等,了解网络协议的工作原理。

实验三:网络服务的配置与测试1、在服务器上配置 Web 服务,安装 IIS 组件,创建网站,并设置相关的权限和访问规则。

2、从客户端访问服务器上的网站,验证 Web 服务的可用性。

3、配置 FTP 服务,设置用户账号和权限,进行文件上传和下载测试。

实验四:网络安全的实现1、在路由器上配置访问控制列表(ACL),限制特定 IP 地址或端口的访问。

2、启用防火墙功能,设置安全策略,防止网络攻击。

四、实验结果与分析实验一结果分析成功搭建了网络拓扑结构,各设备之间能够正常通信。

通过配置正确的网络参数,确保了数据包在网络中的准确传输。

实验二结果分析Ping 命令测试显示网络连通性良好,Wireshark 抓包分析揭示了数据包在网络层和传输层的封装和解封装过程,对 IP 协议和 TCP/UDP 协议的工作机制有了更直观的认识。

计算机网络技术实验报告

计算机网络技术实验报告

计算机网络技术实验报告一、实验目的本次计算机网络技术实验的主要目的是深入了解和掌握计算机网络的基本原理、协议和技术,通过实际操作和实验,提高对网络体系结构、网络设备配置、网络服务搭建以及网络安全等方面的认识和实践能力。

二、实验环境1、硬件环境计算机若干台,具备以太网卡。

交换机、路由器等网络设备。

网线、跳线等连接线缆。

2、软件环境Windows 操作系统。

网络模拟软件,如 Packet Tracer。

命令行工具,如 CMD 终端。

三、实验内容与步骤(一)网络拓扑结构的搭建1、设计简单的网络拓扑结构,包括多个计算机节点、交换机和路由器的连接。

2、使用网线将各个设备按照设计的拓扑结构进行物理连接。

(二)IP 地址规划与配置1、为网络中的每个节点分配合理的 IP 地址、子网掩码、网关等参数。

2、在计算机系统中通过网络设置界面或命令行工具进行 IP 地址的配置。

(三)网络设备的基本配置1、登录交换机和路由器,设置设备名称、管理密码等基本信息。

2、配置交换机的 VLAN 划分,实现不同网段之间的隔离。

3、配置路由器的静态路由和动态路由协议,实现网络之间的互联互通。

(四)网络服务的搭建与测试1、在一台计算机上搭建 Web 服务器,安装 IIS 或 Apache 等服务软件,并配置网站内容。

2、从其他计算机上访问搭建的 Web 服务器,测试网络服务的可用性和性能。

(五)网络安全设置1、配置防火墙规则,限制网络访问权限,防止非法入侵。

2、启用网络访问控制列表(ACL),对特定的 IP 地址或端口进行访问控制。

四、实验结果与分析(一)网络拓扑结构搭建结果成功搭建了设计的网络拓扑结构,各设备之间物理连接正常,指示灯显示工作状态正常。

(二)IP 地址配置结果通过查看计算机的网络设置和使用命令行工具进行IP 地址的验证,确认各节点的 IP 地址、子网掩码和网关配置正确,网络内的计算机能够相互通信。

(三)网络设备配置结果交换机的 VLAN 划分成功,不同 VLAN 之间的计算机无法直接通信,实现了网段隔离的目的。

计算机网络实验报告(6篇)

计算机网络实验报告(6篇)

计算机网络实验报告(6篇)计算机网络实验报告(通用6篇)计算机网络实验报告篇1一、实验目的1、熟悉微机的各个部件;2、掌握将各个部件组装成一台主机的方法和步骤;3、掌握每个部件的安装方法;4、了解微型计算机系统的基本配置;5、熟悉并掌握DOS操作系统的使用;6、掌握文件、目录、路径等概念;7、掌握常用虚拟机软件的安装和使用;8、熟悉并掌握虚拟机上WINDOWS操作系统的安装方法及使用;9、掌握使用启动U盘的制作和U盘安装windows操作系统的方法;10、了解WINDOWS操作系统的基本配置和优化方法。

二、实验内容1.将微机的各个部件组装成一台主机;2.调试机器,使其正常工作;3.了解计算机系统的基本配置。

4.安装及使用虚拟机软件;5.安装WINDOWS7操作系统;6.常用DOS命令的使用;7.学会制作启动U盘和使用方法;8.WINDOWS7的基本操作;9.操作系统的基本设置和优化。

三、实验步骤(参照实验指导书上的内容,结合实验过程中做的具体内容,完成此项内容的撰写)四、思考与总结(写实验的心得体会等)计算机网络实验报告篇2windows平台逻辑层数据恢复一、实验目的:通过运用软件R-Studio_5.0和winhe_对误格式化的硬盘或者其他设备进行数据恢复,通过实验了解windows平台逻辑层误格式化数据恢复原理,能够深入理解并掌握数据恢复软件的使用方法,并能熟练运用这些软件对存储设备设备进行数据恢复。

二、实验要求:运用软件R-Studio_5.0和winhe_对电脑磁盘或者自己的U盘中的删除的数据文件进行恢复,对各种文件进行多次尝试,音频文件、系统文件、文档文件等,对简单删除和格式化的磁盘文件分别恢复,并检查和验证恢复结果,分析两个软件的数据恢复功能差异与优势,进一步熟悉存储介质数据修复和恢复方法及过程,提高自身的对存储介质逻辑层恢复技能。

三、实验环境和设备:(1)Windows _P 或Windows 20__ Professional操作系统。

《计算机网络》实验报告

《计算机网络》实验报告

《计算机网络》实验报告计算机网络实验报告一、引言计算机网络是现代信息技术的基础,它将各种计算机和设备连接在一起,实现数据的传输和共享。

本篇实验报告将介绍我们在《计算机网络》课程中进行的实验内容和实验结果。

二、实验目的本次实验的目的是通过搭建一个简单的局域网并进行通信测试,加深对计算机网络基本概念的理解,掌握网络配置和通信过程中的相关知识。

三、实验环境我们使用了两台计算机和一个交换机来搭建局域网。

其中,计算机A作为服务器,计算机B作为客户端,交换机用于连接两台计算机。

四、实验步骤1. 配置网络参数我们首先在计算机A和计算机B上配置IP地址、子网掩码和默认网关,确保两台计算机处于同一个子网中。

2. 搭建局域网将计算机A和计算机B通过网线连接到交换机的不同端口上,确保物理连接正常。

3. 配置服务器在计算机A上搭建服务器,选择一种合适的网络服务软件,如Apache、Nginx 等,并进行相应的配置。

4. 配置客户端在计算机B上配置客户端,选择一种合适的浏览器软件,如Chrome、Firefox 等,并设置代理服务器的IP地址和端口。

5. 进行通信测试打开浏览器,在客户端中输入服务器的IP地址和端口号,访问服务器上的网页。

观察通信过程中的网络数据传输情况,检查是否能够成功建立连接并获取到服务器上的网页内容。

五、实验结果通过以上步骤,我们成功搭建了一个简单的局域网,并进行了通信测试。

在测试过程中,我们观察到以下结果:1. 网络连接正常计算机A和计算机B通过交换机成功建立了物理连接,网络连接正常。

2. IP地址配置正确计算机A和计算机B的IP地址、子网掩码和默认网关配置正确,处于同一个子网中。

3. 服务器配置成功在计算机A上搭建的服务器配置成功,能够正常响应客户端的请求。

4. 客户端配置成功在计算机B上配置的客户端能够正常访问服务器上的网页,获取到正确的网页内容。

六、实验总结通过本次实验,我们深入了解了计算机网络的基本概念和通信过程,掌握了网络配置和通信测试的方法。

《计算机网络实验》实验报告

《计算机网络实验》实验报告

《计算机网络实验》实验报告一、实验目的计算机网络实验是计算机相关专业学习中的重要实践环节,通过实验操作,旨在深入理解计算机网络的基本原理、协议和技术,提高我们的动手能力和解决实际问题的能力。

具体目的包括:1、熟悉计算机网络的体系结构和各层协议的工作原理。

2、掌握网络设备的配置和管理方法,如交换机、路由器等。

3、学会使用网络工具进行网络性能测试和故障诊断。

4、培养团队合作精神和沟通能力,提高解决复杂问题的综合素养。

二、实验环境本次实验在学校的计算机网络实验室进行,实验室配备了以下设备和软件:1、计算机若干台,安装了 Windows 操作系统和相关网络工具软件。

2、交换机、路由器等网络设备。

3、网络线缆、跳线等连接设备。

三、实验内容及步骤实验一:以太网帧的捕获与分析1、打开网络协议分析软件 Wireshark。

2、将计算机连接到以太网中,启动捕获功能。

3、在网络中进行一些数据传输操作,如访问网站、发送文件等。

4、停止捕获,对捕获到的以太网帧进行分析,包括帧的格式、源地址、目的地址、类型字段等。

实验二:交换机的基本配置1、连接交换机和计算机,通过控制台端口进行配置。

2、设置交换机的主机名、管理密码。

3、划分 VLAN,并将端口分配到不同的 VLAN 中。

4、测试不同 VLAN 之间的通信情况。

实验三:路由器的基本配置1、连接路由器和计算机,通过控制台端口或Telnet 方式进行配置。

2、设置路由器的接口 IP 地址、子网掩码。

3、配置静态路由和动态路由协议(如 RIP 或 OSPF)。

4、测试网络的连通性。

实验四:网络性能测试1、使用 Ping 命令测试网络的延迟和丢包率。

2、利用 Tracert 命令跟踪数据包的传输路径。

3、使用网络带宽测试工具测试网络的带宽。

四、实验结果与分析实验一结果与分析通过对捕获到的以太网帧的分析,我们清楚地看到了帧的结构,包括前导码、目的地址、源地址、类型字段、数据字段和帧校验序列等。

计算机网络实践报告5篇

计算机网络实践报告5篇

计算机网络实践报告5篇(实用版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的实用资料,如职场文书、书信函件、教学范文、演讲致辞、心得体会、学生作文、合同范本、规章制度、工作报告、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor.I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, this store provides various types of practical materials for everyone, such as workplace documents, correspondence, teaching samples, speeches, insights, student essays, contract templates, rules and regulations, work reports, and other materials. If you want to learn about different data formats and writing methods, please pay attention!计算机网络实践报告5篇计算机网络实践报告1开学第一周我们就迎来了计算机网络实训,这门课程与上学期所学的计算机网络相对应,给了我们一个更深刻理解和掌握所学知识的机会。

计算机网络实验报告

计算机网络实验报告

计算机网络实验报告引言计算机网络是现代社会中不可或缺的基础设施,它使得我们能够在全球范围内实现信息交流与资源共享。

为了更好地理解计算机网络的工作原理,本次实验我们进行了一系列的网络实验。

一、网络拓扑实验首先,我们进行了网络拓扑实验,通过搭建不同拓扑结构的网络,观察其性能表现和通信效率。

我们尝试了星型、环状和总线型拓扑结构,并通过测量网络中的传输时延、带宽和吞吐量来评估不同拓扑结构的优劣。

结果显示,星型拓扑结构具有较好的扩展性和可靠性,但是对中央节点的要求较高,一旦中央节点故障,整个网络将无法正常运行。

而环状和总线型拓扑结构则相对简单,但是容易产生信号干扰和数据冲突等问题。

二、网络传输协议实验接下来,我们进行了网络传输协议实验,重点研究TCP/IP协议的性能和可靠性。

我们通过改变传输文件的大小、网络拥塞程度等因素,测试了TCP协议在不同情境下的传输速度和稳定性。

同时,我们也对比了UDP协议的传输效果。

实验结果表明,TCP协议在数据传输方面具有较好的可靠性和流量控制能力,但是在高丢包率的情况下会出现明显的传输延迟。

相比之下,UDP协议虽然传输速度较快,但是无法保证数据的可靠性,容易出现丢包和重传等问题。

三、网络安全实验随后,我们进行了网络安全实验,探讨了网络攻击与防御的相关技术。

我们采用了常见的入侵检测系统和防火墙来保护网络安全,通过模拟各种攻击手段,如拒绝服务攻击、端口扫描等,测试了网络的防护能力。

实验结果显示,入侵检测系统和防火墙能够有效地阻止大多数网络攻击,但是对于某些高级攻击手段,如零日漏洞攻击,仍然存在一定的漏洞。

因此,网络安全的保护需要综合运用各种技术手段,不断提升系统的安全性。

结论通过本次计算机网络实验,我们对网络拓扑结构、传输协议和网络安全等方面有了更深入的理解。

网络拓扑结构的选择应根据实际需求进行权衡,传输协议的选择应根据网络特性和应用场景进行调整,而网络安全则需要综合运用各种安全技术来确保系统的稳定性和数据的安全性。

《计算机网络》实验报告

《计算机网络》实验报告

一、实验目的1. 理解计算机网络的基本概念和结构。

2. 掌握网络设备的配置方法,包括交换机、路由器等。

3. 学习网络协议的作用和配置方法,如TCP/IP、DHCP等。

4. 通过实验加深对网络故障诊断和排除能力的培养。

二、实验内容1. 实验环境实验设备:一台PC机、一台交换机、一台路由器、双绞线、网线等。

实验软件:Windows操作系统、网络管理软件等。

2. 实验步骤(1)网络设备连接首先,将PC机通过网线连接到交换机的一个端口上。

然后,将交换机的另一个端口连接到路由器的WAN口。

最后,将路由器的LAN口连接到PC机的另一台交换机上。

(2)网络设备配置①交换机配置进入交换机命令行界面,配置交换机的基本参数,如VLAN ID、IP地址、子网掩码等。

②路由器配置进入路由器命令行界面,配置路由器的接口参数,如WAN口和LAN口的IP地址、子网掩码等。

同时,配置路由协议,如静态路由、动态路由等。

③PC机配置在PC机的网络设置中,将IP地址、子网掩码、默认网关等信息设置为与路由器LAN口相同的参数。

(3)网络测试①测试PC机与交换机之间的连通性在PC机中ping交换机的IP地址,检查PC机是否能够与交换机通信。

②测试PC机与路由器之间的连通性在PC机中ping路由器的IP地址,检查PC机是否能够与路由器通信。

③测试不同VLAN之间的连通性在PC机中ping另一个VLAN中的设备,检查不同VLAN之间的设备是否能够相互通信。

三、实验结果与分析1. 实验结果(1)PC机与交换机之间连通(2)PC机与路由器之间连通(3)不同VLAN之间的设备相互通信2. 实验分析通过本次实验,我们成功搭建了一个简单的计算机网络,并掌握了网络设备的配置方法。

在实验过程中,我们遇到了一些问题,如网络设备之间的连通性、VLAN之间的通信等。

通过查阅资料和调试,我们解决了这些问题,加深了对计算机网络的理解。

四、实验总结1. 通过本次实验,我们了解了计算机网络的基本概念和结构,掌握了网络设备的配置方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华中科技大学计算机学院《计算机网络》实验报告实验名称网络组建与实施及Socket编程团队成员:注:团队成员贡献百分比之和为1教师评语:实验一——网络组建与实施一.环境操作系统:WINDOWS7 (32位旗舰版)工具:Boson Netsim仿真软件(版本号5.31)二.实验目的1.了解IP协议,网络层协议和数据链路层协议的工作原理机以及工作机制2.掌握IP地址的规划方法3.掌握路由协议的配置方法4.掌握路由器以及二/三层交换机的配置方法5.了解VLAN的划分原理6.掌握访问控制的配制方法三.实验内容及步骤(包括主要流程和说明)实验所用拓扑图如下:图一:图二第一项试验——组网试验1. 设置PC1、PC2的ip分别为192.168.0.1、192.168.0.2,子网掩码为255.255.255.0,网关为192.168.0.254;设置PC3~PC8的ip分别为192.168.1.1~192.168.1.6,子网掩码为255.255.255.0,网关为192.168.1.254;设置Router A的端口地址为ether 0 192.168.0.254,ether 1 192.168.1.254。

测试结果为各PC机之间可以自由通信,部分结果如图1-1所示。

图1-1 (a)图1-1 (b)2.将PC4、PC6、PC8的ip地址改为192.168.2.2、192.168.2.4、192.168.2.6,网关改为192.168.2.254,其他设置不变。

PC4,PC6,PC8之间能互相通信,不能发送数据到其他PC;其他PC之间可以互相通信;PC1,PC2不能发送数据给PC4,PC6,PC8,而PC3,PC5,PC7可以发送数据给PC4,PC6,PC8。

部分结果如图1-2所示。

结果分析:路由器ip为PC3,PC5,PC7的默认网关,PC3,PC5,PC7可以通过路由器访问其他PC,也可以被PC1,PC2访问,而PC4,PC6,PC8无法通过路由器访问其他子网段PC图1-2 (a) PC3的ping结果图1-2 (b) PC1的ping结果图1-2(c) PC4的ping结果第二项试验——路由配置试验1.首先按如下要求配置各PC的IP地址2.路由器配置如下(Router A配置如下,其它路由器配置类似)3.RIP协议配置(Router A配置如下,其它路由器配置类似)4.思考题如果不设置时钟频率,各PC无法相互访问OSPF协议配置(Router A配置如下,其它路由器配置类似)结果是各PC能相互访问,部分结果见图2-1。

图3-1 (a) PC2的ping结果第三项试验——VLAN划分试验1.在switch2,switch3,switch4上设置一个名为class的VTP域,并创建一个名为Class1的VLAN2以及名为Class2的VLAN3.2.将switch2,switch3,switch4的各个端口分配到新创建的相应VLAN中。

(switch2的配置如下,switch3,switch4的配置与之类似,端口为fa0/3和fa0/4)3.配置switch2,switch3,switch4之间的trunk链路。

(switch2的配置如下,switch3,switch4的配置与之类似,端口为fa0/1和fa0/2)此时,PC3,PC5,PC7处于VLAN2,PC4,PC6,PC8处于VLAN3,VLAN2和VLAN3内部PC可以互相访问,但VLAN之间无法访问。

部分结果见图3-1。

图3-1 (a) PC3的ping结果图3-1 (b) PC4的ping结果第四项试验——访问控制配置试验1.对路由器Router A进行配置,使得PC1无法访问其它PC,也不能被其它PC访问部分结果见图4-1。

图4-1 (a) PC1的ping结果图4-1 (b) PC2的ping结果实验二——支持多线程处理的web服务服务端软件一.环境操作系统:WINDOWS 7 (32位旗舰版)运行工具:chrome浏览器编写程序语言:C++环境:Qt Creator 5.1.0二.实验目的1.了解应用层和运输层的作用以及相关协议的工作原理和机制2.掌握SOCKET编程的基本方法三.实验内容及步骤(包括主要流程和说明)内容:编写一个支持多线程处理的web服务服务端软件要求如下:第一级:1.可配置Web服务器的IP地址、监听端口和主目录2.制作一个主页放在主目录中,并配置Web服务器的IP地址、监听端口和主目录3.具备完成所需功能的基本图形用户界面(GUI),并具友好性第二级:1.选择合适的Socket编程模型,创建套接字,监听所配置的监听端口2.支持服务的启动和关闭3. 具备完成所需功能的基本图形用户界面(GUI),并具友好性第三级:1.支持多线程,能够针对每一个新的请求创建新的线程2.在服务端的屏幕上输出每一个请求的来源(IP地址、端口号和HTTP请求命令行)3.支持一定的异常情况处理能力4.具备完成所需功能的基本图形用户界面(GUI),并具友好性第四级:1.能够处理HTTP请求以及定位相应的HTML文件2.向客户端发送响应报文3.对于无法成功定位文件的请求,根据错误原因,做相应的错误提示4.在服务端的屏幕上能够输出对每一个请求处理的结果5.具备完成所需功能的基本图形用户界面(GUI),并具友好性第五级:1.支持多种类型文件(如TXT和JPG等)的发送2.具备简洁方便的GUI界面步骤:代码实现部分1.启动服务:BOOL QHttpServer::Start(string HomeDir, string DefIndex, int Port, int PersTO){m_HomeDir = HomeDir;m_DefIndex = DefIndex;if(m_HomeDir.substr(m_HomeDir.size() - 1, 1) != "\\")m_HomeDir += "\\";if(bRun){//LogMessage(LOGFILENAME, "_beginthreadex(...) failure, for Launch Thread", "Run", errno);return FALSE;}ServerPort = Port;PersistenceTO = PersTO;InitializeCriticalSection(&cs);InitializeCriticalSection(&_cs);Reset();ThreadLaunchedEvent = CreateEvent(NULL, FALSE, TRUE, NULL);// 启动接收线程ResetEvent(ThreadLaunchedEvent);ThreadA = (HANDLE)_beginthreadex(NULL, 0, AcceptThread, this, 0, &ThreadA_ID);if(!ThreadA){//LogMessage(LOGFILENAME, "_beginthreadex(...) failure, for Launch Thread", "Run", errno);return FALSE;}if(WaitForSingleObject(ThreadLaunchedEvent, THREADWAIT_TO) != WAIT_OBJECT_0) {//LogMessage(LOGFILENAME, "Unable to get response from Accept Thread withing specified Timeout ->", "Run", THREADWAIT_TO);CloseHandle(ThreadLaunchedEvent);return FALSE;}CloseHandle(ThreadLaunchedEvent);bRun = TRUE;return TRUE;// return Run(Port, PersTO);}2.关闭服务:BOOL QHttpServer::Shutdown(){if(!bRun)return FALSE;BOOL bResult = TRUE;HANDLE hArray[2];hArray[0] = ThreadA;hArray[1] = ThreadC;//// 关闭接收和helper线程//SetEvent(ShutdownEvent);DWORD n = WaitForMultipleObjects(2, hArray, TRUE, THREADKILL_TO);if(n == WAIT_TIMEOUT || n == WAIT_FAILED){//LogMessage(LOGFILENAME, "WaitForMultipleObjects(...) timed out", "Shutdown");//if(!TerminateThread(ThreadA, THREADEXIT_SUCCESS))//LogMessage(LOGFILENAME, "TerminateThread(.ThreadA.) failure, probably it is already terminated", "Shutdown", GetLastError());//if(!TerminateThread(ThreadC, THREADEXIT_SUCCESS))//LogMessage(LOGFILENAME, "TerminateThread(.ThreadC.) failure, probably it is already terminated", "Shutdown", GetLastError());bResult = FALSE;}CloseHandle(ThreadA);CloseHandle(ThreadC);//// 所有的客户线程都结束//THREADLIST::iterator it;while(ThreadList.size()){Sleep(100);}DeleteCriticalSection(&cs);DeleteCriticalSection(&_cs);bRun = FALSE;return bResult;}3.增加新链接:BOOL QHttpServer::AddClient(SOCKET s, char* clientAddress, int port){VISVECTOR::iterator it;it = find(Visitors.begin(), Visitors.end(), clientAddress);//查找重复IPif(it == Visitors.end()){Visitors.push_back(clientAddress);//增加新客户IPvisitsip.push_back(clientAddress);//输出用}InterlockedIncrement(&Stats.nTotalHits);//互斥ThreadTag t hreadTag;HANDLE hThread;unsigned int threadID;//进入临界区并创建连接对象EnterCriticalSection(&cs);NewConnectionTag *NewConn = new NewConnectionTag;NewConn->pHttpServer = this;NewConn->s = s;hThread = (HANDLE)_beginthreadex(NULL, 0, ClientThread, NewConn, 0, &threadID);if(hThread){threadTag.threadID = threadID;threadTag.hThread = hThread;ThreadList.push_back(threadTag);}elseserverlog.push_back("_beginthreadex(...) failure");//else//LogMessage(LOGFILENAME, "_beginthreadex(...) failure", "AddClient", errno);LeaveCriticalSection(&cs);return TRUE;}4.分析请求数据:BOOL QHttpServer::ParseRequest(string szRequest, string &szResponse, BOOL &bKeepAlive) {string szMethod;string szFileName;string szFileExt;string szStatusCode("200 OK");string szContentType("text/html");string szConnectionType("close");string szNotFoundMessage;string szDateTime;char pResponseHeader[2048];fpos_t lengthActual = 0, length = 0;char *pBuf = NULL;int n;//// 检查提交方法//n = szRequest.find(" ", 0);if(n != string::npos){szMethod = szRequest.substr(0, n);if(szMethod == "GET"){//// 获取文件名//int n1 = szRequest.find(" ", n + 1);if(n != string::npos){szFileName = szRequest.substr(n + 1, n1 - n - 1);if(szFileName == "/"){szFileName = m_DefIndex;}}else{return FALSE;}}else{szStatusCode = "501 Not Implemented";szFileName = ERROR501;}}else{return FALSE;}//// 分析链接类型//n = szRequest.find("\nConnection: Keep-Alive", 0);if(n != string::npos)bKeepAlive = TRUE;//// 分析内容类型//int nPointPos = szFileName.rfind(".");if(nPointPos != string::npos){szFileExt = szFileName.substr(nPointPos + 1, szFileName.size());strlwr((char*)szFileExt.c_str());MIMETYPES::iterator it;it = MimeTypes.find(szFileExt);if(it != MimeTypes.end())szContentType = (*it).second;}//得到目前的时间//char szDT[128];struct tm *newtime;time_t ltime;time(&ltime);newtime = gmtime(&ltime);strftime(szDT, 128,"%a, %d %b %Y %H:%M:%S GMT", newtime);//// 读取文件//FILE *f;f = fopen((m_HomeDir + szFileName).c_str(), "r+b");if(f != NULL){// 获得文件大小fseek(f, 0, SEEK_END);fgetpos(f, &lengthActual);fseek(f, 0, SEEK_SET);pBuf = new char[lengthActual + 1];length = fread(pBuf, 1, lengthActual, f);fclose(f);//// 返回响应//sprintf(pResponseHeader, "HTTP/1.0 %s\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: bytes\r\nContent-Length: %d\r\nConnection: %s\r\nContent-Type: %s\r\n\r\n",szStatusCode.c_str(), szDT, SERVERNAME, (int)length, bKeepAlive ? "Keep-Alive" : "close", szContentType.c_str());}else{//// 如果文件没有找到//f = fopen((m_HomeDir + ERROR404).c_str(), "r+b");if(f != NULL){// 获取文件大小fseek(f, 0, SEEK_END);fgetpos(f, &lengthActual);fseek(f, 0, SEEK_SET);pBuf = new char[lengthActual + 1];length = fread(pBuf, 1, lengthActual, f);fclose(f);szNotFoundMessage = string(pBuf, length);delete pBuf;pBuf = NULL;}szStatusCode = "404 Resource not found";sprintf(pResponseHeader, "HTTP/1.0 %s\r\nContent-Length: %d\r\nContent-Type:text/html\r\nDate: %s\r\nServer: %s\r\n\r\n%s",szStatusCode.c_str(), szNotFoundMessage.size(), szDT, SERVERNAME, szNotFoundMessage.c_str());bKeepAlive = FALSE;}szResponse = string(pResponseHeader);if(pBuf)szResponse += string(pBuf, length);delete pBuf;pBuf = NULL;return TRUE;}5.多线程的实现:UINT__stdcall QHttpServer::AcceptThread(LPVOID pParam){QHttpServer *pHttpServer = (QHttpServer*)pParam;SOCKET s; // 主线程WORD wVersionRequested;WSADATA wsaData;sockaddr_in saLocal;WSAEVENT Handles[2];WSANETWORKEVENTS NetworkEvents;sockaddr ClientAddr;INT addrlen = sizeof(ClientAddr);sockaddr_in sain;char cAddr[50];int result;saLocal.sin_family = AF_INET;saLocal.sin_port = htons(pHttpServer->ServerPort);saLocal.sin_addr.s_addr = INADDR_ANY;//(ULONG)(pHttpServer->ipcon);wVersionRequested = MAKEWORD(2, 2);result = WSAStartup(wVersionRequested, &wsaData);if(result != 0){//pHttpServer->LogMessage(LOGFILENAME, "WSAStartup(...) failure", "AcceptThread", result);serverlog.push_back("WSAStartup(...) failure");return THREADEXIT_SUCCESS;}if( LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2){//pHttpServer->LogMessage(LOGFILENAME, "Requested Socket version not exist", "AcceptThread");serverlog.push_back("Requested Socket version not exist");pHttpServer->CleanupThread(NULL, NULL, NULL);return THREADEXIT_SUCCESS;}s = WSASocket(AF_INET, SOCK_STREAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0,WSA_FLAG_OVERLAPPED);if(s == INVALID_SOCKET){//pHttpServer->LogMessage(LOGFILENAME, "WSASocket(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("WSASocket(...) failure");pHttpServer->CleanupThread(NULL, NULL, NULL);return THREADEXIT_SUCCESS;}//// 绑定//result = bind(s, (struct sockaddr *)&saLocal, sizeof(saLocal));if(result == SOCKET_ERROR){//pHttpServer->LogMessage(LOGFILENAME, "bind(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("bind(...) failure");pHttpServer->CleanupThread(NULL, NULL, s);return THREADEXIT_SUCCESS;}//// 侦听//result = listen(s, SOMAXCONN);if(result == SOCKET_ERROR){//pHttpServer->LogMessage(LOGFILENAME, "listen(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("listen(...) failure");pHttpServer->CleanupThread(NULL, NULL, s);return THREADEXIT_SUCCESS;}pHttpServer->ShutdownEvent = WSACreateEvent();if(pHttpServer->ShutdownEvent == WSA_INVALID_EVENT){//pHttpServer->LogMessage(LOGFILENAME, "WSACreateEvent(...) failure for ShutdownEvent", "AcceptThread", WSAGetLastError());serverlog.push_back("WSACreateEvent(...) failure for ShutdownEvent");pHttpServer->CleanupThread(NULL, NULL, NULL, s);return THREADEXIT_SUCCESS;}//创建事件WSAEVENT Event = WSACreateEvent();if(Event == WSA_INVALID_EVENT){//pHttpServer->LogMessage(LOGFILENAME, "WSACreateEvent(...) failure for Event", "AcceptThread", WSAGetLastError());serverlog.push_back("WSACreateEvent(...) failure for Event");pHttpServer->CleanupThread(NULL, pHttpServer->ShutdownEvent, s);return THREADEXIT_SUCCESS;}Handles[0] = pHttpServer->ShutdownEvent;Handles[1] = Event;result = WSAEventSelect(s, Event, FD_ACCEPT);if(result == SOCKET_ERROR){//pHttpServer->LogMessage(LOGFILENAME, "WSAEventSelect(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("WSAEventSelect(...) failure");pHttpServer->CleanupThread(Event, pHttpServer->ShutdownEvent, s);return THREADEXIT_SUCCESS;}SetEvent(pHttpServer->ThreadLaunchedEvent);for(;;){DWORD EventCaused = WSAWaitForMultipleEvents(2,Handles,FALSE,WSA_INFINITE,FALSE);if(EventCaused == WAIT_FAILED || EventCaused == WAIT_OBJECT_0){if(EventCaused == WAIT_FAILED){serverlog.push_back("WaitForMultipleObjects(...) failure");}//pHttpServer->LogMessage(LOGFILENAME, "WaitForMultipleObjects(...) failure", "AcceptThread", GetLastError());pHttpServer->CleanupThread(Event, pHttpServer->ShutdownEvent, s);return THREADEXIT_SUCCESS;}result = WSAEnumNetworkEvents(s,Event,&NetworkEvents);if(result == SOCKET_ERROR){//pHttpServer->LogMessage(LOGFILENAME, "WSAEnumNetworkEvents(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("WSAEnumNetworkEvents(...) failure");pHttpServer->CleanupThread(Event, pHttpServer->ShutdownEvent, s);return THREADEXIT_SUCCESS;}if(NetworkEvents.lNetworkEvents == FD_ACCEPT){SOCKET ClientSocket = WSAAccept(s, &ClientAddr, &addrlen, NULL, NULL);memcpy(&sain, &ClientAddr, addrlen);sprintf(cAddr, "%d.%d.%d.%d",sain.sin_addr.S_un.S_un_b.s_b1,sain.sin_addr.S_un.S_un_b.s_b2,sain.sin_addr.S_un.S_un_b.s_b3,sain.sin_addr.S_un.S_un_b.s_b4);if(INVALID_SOCKET == ClientSocket){//pHttpServer->LogMessage(LOGFILENAME, "WSAAccept(...) failure", "AcceptThread", WSAGetLastError());serverlog.push_back("WSAAccept(...) failure");// 有一个文件错误continue;}else{if(!pHttpServer->AddClient(ClientSocket, cAddr, sain.sin_port)){//pHttpServer->LogMessage(LOGFILENAME, "AddClient(...) failure", "AcceptThread");serverlog.push_back("AddClient(...) failure");continue; // I think there is no reason to shutdown whole server if just one connection failed}}}}pHttpServer->CleanupThread(Event, pHttpServer->ShutdownEvent, s);return THREADEXIT_SUCCESS;四.实验结果1.配置界面:IP配置,监听端口配置,主目录配置2.服务器开启后主页(因未进行中文解码,导致中文显示乱码)3.开启与关闭4.多线程访问并输出请求来源以及请求处理的结果5.访问不同类型文件TXT文件:JPG文件:6.根据错误原因作相应提示7.服务器关闭五.实验中的问题及心得本次实验对于我们来说是一个考验,第一个实验本身的内容并不复杂,但是要求实验时足够严谨,稍有疏忽而产生小纰漏的话,最后就会前功尽弃。

相关文档
最新文档