计算机网络实验1:HTTP 代理服务器的设计与实现

本文详细介绍了如何设计和实现一个HTTP代理服务器,包括修改错误、理解基本原理,以及添加网站过滤、用户过滤、网站引导和缓存等高级功能。在实验演示部分,展示了基础功能、Cache功能、屏蔽网站、屏蔽用户和钓鱼功能的实际效果。
摘要由CSDN通过智能技术生成

目录

一、修改并理解参考代码 

1.修改错误

2.基本代理服务器原理

二、附加功能的实现

1.网站过滤:允许/不允许访问某些网站

2.用户过滤:支持/不支持某些用户访问外部网站

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

4.cache实现

原理

 实现过程

三、实验演示结果

1.基础功能

 2.Cache功能

3.屏蔽网站

4.屏蔽用户

5.钓鱼功能


一、修改并理解参考代码 

1.修改错误

  • 提示#include "stdafx.h"找不到并且产生大量错误 ,比如HttpHeader有问题之类

解决方法:

        本人使用VS2019,直接将这个头文件从网上下载了一份,放入VS的头文件目录下,在项目上右键打开选项,我的目录是D:\Windows Kits\10\Include\10.0.19041.0\um

         另一点需要注意的是在VS中把源文件的后缀改为cpp而不是c

  • 提示 E0546    控制传输跳过的实例化:

goto语句的问题,不能在goto语句后面还增加定义,否则会认为没有初始化而报错

解决方法:

           把定义语句 HttpHeader* httpHeader = new HttpHeader(); 放在goto之前的位置即可

  • 运行报错'gethostbyname': Use getaddrinfo() or GetAddrInfoW) instead or define
    _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated APl warnings

解决方法:

打开项目属性,编辑预处理器定义,增加 _WINSOCK_DEPRECATED_NO_WARNINGS,如图:

  •  运行时提示错误:LNK2019无法解析的外部符号WinMain,该符号在函数"int _cdeclinvoke_main(void)" (?invoke_main@@YAHXZ)中被引用

这个问题似乎是c语言运行时找不到适当的程序入口函数,也就是主函数和当前项目不匹配的问题。

解决方法:

        将主函数int _tmain(int argc, char * argv[])

        直接改为int main()

        并且解决方案平台一定选择x64

  • VS2019输出控制台中文乱码

        记事本里改为ANSI格式,因为VS2019控制台的编码是GBK,而文件可能是UTF-8格式

        这里折腾了很久,是因为原来安过的一个拓展,每次强行把文件变为UTF-8,把拓展禁用就好了。

2.基本代理服务器原理

①首先初始化一个套接字(代码中的BOOL InitSocket()函数)

WSAStartup(wVersionRequested, &wsaData);
ProxyServer = socket(AF_INET, SOCK_STREAM, 0);  //Socket创建套接字
bind(ProxyServer, (SOCKADDR*)&ProxyServerAddr, sizeof(SOCKADDR)
listen(ProxyServer, SOMAXCONN)

        利用 bind() 函数将该套接字与服务器 host 地址绑定,host 地址设为 “127.0.0.1”;

        绑定端口号(例如:“10240”)

        然后,利用 listen() 函数对该端口进行监听。

②通过accept() 函数,对每个报文的到来请求进行接收和相应,为了提供效率,对每个请求都创建一个新的线程来处理。代理服务器一直循环此段代码,达到不断监听的效果

acceptSocket = accept(ProxyServer, (SOCKADDR*)&acceptAddr, NULL);
lpProxyParam = new ProxyParam;
lpProxyParam->clientSocket = acceptSocket;
//创建新线程
hThread = (HANDLE)_beginthreadex(NULL, 0, &ProxyThread, (LPVOID)lpProxyParam, 0, 0);
CloseHandle(hThread);
Sleep(200);

④接下来进入线程执行函数unsigned int __stdcall ProxyThread(LPVOID lpParameter)

        利用 recv() 和 send() 函数,接收来自客户端的 HTTP 请求,并通过代理服务器将该请求转发给服务器;同时,服务器也将获得的响应发给代理服务器,然后代理服务器再

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值