动态ip

>

代理ip软件

>

换ip软件

>

HTTP代理

>
Socks5代理
黑核动态ip代理
您的位置: 首页 > 新闻资讯 > 正文

HTTP代理服务器的设计与实现

发布时间:2020-01-14 14:24:18 来源:黑核动态ip代理

分享到

  花了好几天才把计算机网络的实验一搞定,在此记录一下这个实验的流程。

  本实验的要求也是比较简单明了的:

  (1)设计并实现一个基本HTTP代理服务器。要求在指定端口(例如8080)接收来自客户的HTTP请求并且根据其中的URL地址访问该地址所指向的HTTP服务器(原服务器),接收HTTP服务器的响应报文,并将响应报文转发给对应的客户进行浏览。

  (2)设计并实现一个支持Cache功能的HTTP代理服务器。要求能缓存原服务器响应的对象,并能够通过修改请求报文(添加if-modified-since头行),向原服务器确认缓存对象是否是最新版本。(选作内容,加分项目,可以当堂完成或课下完成)

  (3)扩展HTTP代理服务器,支持如下功能:(选作内容,加分项目,可以当堂完成或课下完成)

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

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

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

  而且实验指导书上还给出了200来行的代码作为参考,可以说是很贴心了。但关键问题不是不知道原理,而是对socket编程是相当地陌生,还好代码大部分都能看懂,看不懂的查询一下也能搞定。本实验基本功能还是很好做的,主要就是cache的实现,我大部分时间就在搞这个,最后东拼西凑的,也算是搞出来了(虽然外部存储有时会乱码)。

  实验代码在我github上,想参考的话,可以点击这里,欢迎来提各种建议,虽然我也不一定会去改,但还是希望这个代码会越来越好。

  实验配置问题

  首先要说的就是环境问题,由于我是使用的CodeBlocks进行编译的,因此,有时候会出现一些莫名的问题。这里简单介绍一下。

  1.最大的问题就是静态链接问题,也就是这段代码#pragmacomment(lib,"Ws2_32.lib"),在VS里可以很好地运行,但是在CodeBlocks中就失去作用了。这段代码也很简单,就是说要链接一个库,但是Codeblocks使用的是MingGW来编译,MingGW不支持#pragmacomment(lib,"Ws2_32.lib")的写法。

  2.解决方法也是很简单,由于该命令是静态链接Ws2_32.lib库,因此可以在设置里,加上-lws2_32或-lwsock32,具体怎么加,这里就不讲了。

  3.第二个问题也是编译器的问题,由于版本问题,这里并不支持int_tmain(intargc,_TCHAR*argv[])的写法,需要改成intmain(intargc,char*argv[])或者直接写成intmain(),其实没有什么区别。具体原因,参考main()和_tmain(intargc,_TCHAR*argv[])的详细区别和c/c++int_tmain(intargc,_TCHAR*argv[])

  4.再就是goto语句的问题了,代码一直报goto语句的问题,不常用这个,我也是很懵啊,不过,还好前辈们有经验分享,具体原因可以参考这个:g++编译goto语句出现:[error:jumptolabelXXX],简单地说,就是你的goto语句之后不能再定义新的变量。

  5.再就是关于strtok_s的问题了,可以参考这篇stackoverflow:关于strtok_s的问题,就是说,只要改成strtok()这个函数就可以了。再去掉最后一个参数,因为这个函数只需要俩参数。虽然这个函数并不安全,但它可以用啊。

  大点的问题就这些,还有一些小的问题,比如VS里专用的#include"stdafx.h",要去掉,可以参考为什么要加#include“stdafx.h”,剩下的,大都没有详细说的必要了

  好了,bug就算是修复完了,现在就可以正常访问网站了:

  运行程序-->打开浏览器-->设置代理-->设置127.0.0.1和端口号1240

  这样就实现了一个基本的代理服务器,其实现在就已经完成第一个要求了。但你还不知道它的原理是什么,所以,下面看一下它的原理。

  实现一个基本的代理服务器

  在继续往下看之前,你最好对这几个函数有一定的了解:

  bind():将一本地地址与一套接字捆绑,在connect()或listen()调用前使用

  listen():监听套接字的连接请求,将套接字设为监听模式

  connect():用于建立与指定socket的连接

  accept():在一个套接字处,接受一个连接

  send():发送数据(客户端向服务器发送请求,服务器端向客户端发送应答)

  recv():接收数据

  更详细的可以自行去百度查找,这里就不多介绍了。先来看代理服务器的原理:

  首先初始化一个套接字,利用blind()函数将该套接字与服务器host地址绑定,地址设为“127.0.0.1”;同时,也要绑定端口号,这里就按照指导书上的要求设置为“10240”。然后,利用listen()函数对该端口进行监听。

  通过设置accept()函数,对每个到来的请求进行接收和相应,为了提供效率,对每个请求都创建一个新的线程来处理。

  利用recv()和send()函数,接收来自客户端的HTTP请求,并通过这个代理服务器将该请求转发给服务器;同时,服务器也将获得的响应发给代理服务器,然后代理服务器再将该响应发送给客户端。在这里,代理服务器相当于一个中介,提供一个代理的服务,所有的请求和响应都经过它。

  处理完成后,等待200 ms后,关闭该线程,并清理缓存,然后继续接收并处理下一个请求。对于客户端而言,它只要将正常发送的请求发给代理服务器,就可以接收到对应的响应。

  用流程图可以表示为:

HTTP代理服务器的设计与实现.png

  我个人觉得,这张流程图非常容易理解,基本上就是这段代码的逻辑,对于理解这段代码很有帮助。

  扩展功能

  对于这三个扩展功能,只要看懂了代码是如何解析并存储的HTTP头部信息,写这三个功能还是很简单的。不需要增加多少代码,只需进行if判断即可。

  屏蔽网站

  对请求过来的HTTP报文头部进行检测,提取出其中的访问地址url,检测其是否为要被屏蔽的网址,如果是,则直接跳转到代码中的erro部分,即关闭套接字,断开此次连接。代码片段如下:

  if(strcmp(httpHeader->url,INVILID_WEBSITE)==0){

  printf("\n=====================================\n\n");

  printf("-------------Sorry!!!该网站已被屏蔽----------------\n");

  gotoerror;

  }

  屏蔽用户

  更改套接字绑定的主机地址,这样的话,只要不是从该地址访问代理服务器的客户端,都会被该代理服务器屏蔽,部分代码如下:

  //屏蔽用户

  //ProxyServerAddr.sin_addr.S_un.S_addr=INADDR_ANY;

  ProxyServerAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//仅本机用户可访问服务器

  //ProxyServerAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.2");//屏蔽用户

  其实,就是更改套接字绑定的代理服务器的IP地址,这样的话,就会屏蔽掉从其他接口进行访问客户端,从而实现用户屏蔽。

  钓鱼

  检测请求过来的HTTP报文头部,如果发现访问的网址是要被钓鱼的网址,则将该网址引导到其他网站(钓鱼网址),通过更改HTTP头部字段的url(访问网址)和host主机名来实现,部分代码如下:

  if(strstr(httpHeader->url,FISHING_WEB_SRC)!=NULL){

   printf("\n=====================================\n\n");

   printf("-------------已从源网址:%s转到目的网址:%s----------------\n",FISHING_WEB_SRC,FISHING_WEB_DEST);

   memcpy(httpHeader->host,FISHING_WEB_HOST,strlen(FISHING_WEB_HOST)+1);

  memcpy(httpHeader->url,FISHING_WEB_DEST,strlen(FISHING_WEB_DEST));

  cache实现

  cache可以说是这个实验最精髓的地方了,原理很简单,比较容易理解,但代码写起来还是比较长的,起码比前几个实现起来要复杂。我也是参考了很多前辈们的代码才写出来的,这里就简单介绍一下原理吧,代码自己去看我的实现吧,前面已经给了链接,这里再补充一下:实验一

  基本原理

  客户端第一次请求服务器中的数据时,代理服务器将该请求返回的响应缓存下来,存到本地的文件下。

  当客户端第二次访问该数据时,代理服务器检查本地是否有该请求的响应,如果没有,则继续缓存;如果有,则向服务器发送一个请求,该请求需要增加“If-Modified-Since”字段,通过此字段,告知服务器缓存资源最后修改的时间(可以将“Date”字段进行解析),服务器通过对比最后修改时间来判断缓存是否过期,如果没过期,服务器返回状态码304,代理服务器直接将本地缓存发送给客户端;如果缓存过期,服务器返回状态码200,同时返回一个更新过的响应,代理服务器接收后,将该响应发回给客户端,并更新本地缓存。

  这一部分的代码虽然代码稍微多一些,但其实也没多少,而且原理很简单,不需要害怕,大胆去写就好了。

  总结

  这次实验对理解HTTP代理服务器还是很有帮助的,真正体会到了代理服务器的作用。虽然调试的时候会出来一堆莫名的bug,但是改好后的感觉还是相当不错的。


相关资讯

使用高质量代理ip设计分布式爬虫的一些思路

假如不用代理ip,爬虫业务必定无路可行,因此大部分爬虫工作者都会去购买安全稳定的代理ip。使用了高质量的代理ip后,会不会就能够无后顾之忧了呢?这个可不会这么容

来源:黑核动态ip代理

2019-06-04 10:22:08

高质量代理ip设计分布式爬虫的思路

假如不用代理ip,爬虫业务必定无路可行,因此大部分爬虫工作者都会去购买安全稳定的代理ip。使用了高质量的代理ip后,会不会就能够无后顾之忧了呢?这个可不会这么容

来源:黑核动态ip代理

2019-08-24 11:13:05

本地代理IP池怎样设计和日常维护

无论是爬取免费的代理IP,还是购买付费的代理IP,都可以尝试在本地设计一个IP代理池。这样既方便使用,又可以提升工作效率。想在本地设计一个代理IP池应该怎么做呢

来源:黑核动态ip代理

2019-11-06 15:17:42

HTTP代理服务器的设计与实现

花了好几天才把计算机网络的实验一搞定,在此记录一下这个实验的流程。本实验的要求也是比较简单明了的:(1)设计并实现一个基本HTTP代理服务器。要求在指定端口(例

来源:黑核动态ip代理

2020-01-14 14:24:18

实用https代理服务器别人能查到真实地址吗

现在,高匿代理ip时代已经到来,但是,还是有很多人不了解高匿代理ip到底有什么用,虽然随着网络科技的发展,网络对我们的生活带来了很多方便,也带来了更多的选择,网

来源:黑核混拨ip加速器网

2018-12-28 17:02:47

什么是代理服务器?代理服务器有什么用?

代理服务器(ProxyServer)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用。代理服务器大多被用来连接

来源:黑核混拨ip代理

2019-01-21 10:58:07

IP代理服务器怎样才能够满足客户的需求?

近几年来,代理服务器的发展越来越迅速,很多人都掌握了网络托管的常识,在办理网站时服务器也是必不可少的,而且代理服务器网站为客户提供资源选择使代理服务器随着市场的

来源:黑核混拨ip代理

2019-03-27 14:17:04

互联网工作中ip代理是不可缺少的工具

目前,中国的互联网大军正在不断壮大,各种各样依托互联网的新兴行业正在兴起,哪怕是很多传统行业,为了抢占竞争的制高点,也将跟友商之间的竞争搬到了互联网平台之上。对

来源:黑核混拨ip加速器网

2018-12-27 17:45:23

代理ip软件能帮助你实现优化网站

如今代理IP工具在营销领域,无论是主动式的发布推广信息,还是被动性反制竞争对手的恶意点击来说,都具有不可替代的作用。可细心的人们发现市面上代理IP的软件太多,如

来源:黑核混拨ip加速器网

2019-01-08 17:54:51

为什么会诞生代理ip软件的 免费与收费代理ip软件区别

现在做网站最头痛的就是有人采集自己的网站,所以很多做网站的都会做防采集措施,或者封掉大量采集页面的ip,那么封掉ip这个对于采集的人来说就很痛苦了,直接不能访问

来源:黑核混拨ip加速器网

2019-01-07 13:36:28

现在采集越来越难如何找到实用的HTTP代理IP

目前,中国的互联网大军正在不断壮大,各种各样依托互联网的新兴行业正在兴起,哪怕是很多传统行业,为了抢占竞争的制高点,也将跟友商之间的竞争搬到了互联网平台之上。对

来源:黑核混拨ip加速器网

2018-12-28 15:56:10

在线客服
大客户VIP渠道
点击这里给我发消息
讨论QQ群
客服电话
13318873961