您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页哈工大计算机网络实验一——HTTP代理服务器的设计与实现

哈工大计算机网络实验一——HTTP代理服务器的设计与实现

来源:华佗小知识

实验内容

2. 设计并实现一个支持Cache功能的HTTP代理服务器。要求能缓存原服务器响应的对象,并能够通过修改请求报文(添加if-modified-since头行),向原服务器确认缓存对象是否是最新版本。

3. 扩展HTTP代理服务器,支持如下功能:

  • 网站过滤:允许/不允许访问某些网站;
  • 用户过滤:支持/不支持某些用户访问外部网站;
  • 网站引导:将用户对某个网站的访问引导至一个模拟网站(钓鱼)。

一、实验总体思路

首先了解一下客户端和服务器端的基本任务:

客户端(Client服务器端(Server
  1. 对到来的请求创建套接字,绑定套接字的IP地址和端口号,对端口进行监听;
  2. 等待入连接请求;
  3. 从套接字中读取请求;
  4. 对请求进行响应,发送响应数据;
  5. 关闭连接;

本实验实现的即是一个HTTP代理服务器,接收并发送来自客户的HTTP请求,同时转发来自HTTP服务器的响应报文到客户端。在此过程中,既充当客户端,又充当服务器端的角色。

二、实验基础代理部分

1.主函数

总体上使用InitSocket()函数初始化套接字socket,利用while(true)循环与listen函数实现对指定端口的持续监听;使用accept函数接收请求,同时创建子线程进行报文的转发响应;处理完成后,等待200ms关闭该线程,并清理缓存;重复循环处理下一个请求

2. InitSocket()函数初始化套接字

此函数主要分为两步:加载套接字库和初始化套接字。

i). 加载套接字库。此步骤加载Socket库,并检查winsock.dll的加载是否成功以及版本是否匹配。

3. ProxyThread()线程处理函数

在线程函数中,首先需要使用ZeroMemory()方法初始化内存,再使用recv()函数接收来自客户端的HTTP请求,消息内容缓存在Buffer中,recvSize为实际收到的报文字节数,而后使用ParseHttpHead函数对HTTP报文首部进行解析。

接下来调用recv()函数等待目标服务器返回数据,可以理解为网页内容, 接受之后将返回的数据直接转发给客户端,结束本次线程处理。

最后是异常处理,如果在过程中有异常均跳转到error,结束线程运行。

4. ParseHttpHead()HTTP头部解析函数

根据下图HTTP请求报文头部结构,使用strtok_s()方法对报文信息进行分割提取,得到方法、URL、Host、Cookie等信息。

5. ConnectToServer ()函数连接服务器

三、Cache部分功能设计

当访问某网站时,首先通过URL对应的文件名寻找本地对应缓存文件,

1) 若无对应文件,即为第一次访问某网站,则代理服务器通过writeinCache()函数将该请求返回的响应数据写入缓存即相应文件中

2) 若匹配到本地缓存文件,则获取文件中的Date信息,利用MakeNewHTTP()函数构造条件GET报文,即为报文在Host后插入If-Modified-Since头部行。

再向服务器端发送请求,通过服务器返回的数据码判断是否为最新的数据,若返回304,则内容并未再次更新,直接使用readCache()方法读取缓存中的内容并转发给客户端;若返回200,则将此响应报文直接发给客户端,同时更新本地缓存。

由于上述writeinCache()readCache(),MakeNewHTTP()均为简单的文件读写、字符串插入等操作,此处不再给出截图。

四、扩展功能设计

a) 网站过滤:允许/不允许访问某些网站;

b) 用户过滤:支持/不支持某些用户访问外部网站;

也可以在accept()监听套接字时获取客户端IP与禁止访问IP进行字符串比较以实现用户屏蔽。

c) 网站引导:将用户对某个网站的访问引导至一个模拟网站

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务