在编写一个通过P2P允许内网访问另一内网的web Server时,涉及截取浏览器发出的请求,对请求进行分析,如果是某个特定的HOST时,则进行转向。发起P2P请求到另一内网的某个主机。
经过实验性编程,终于解决了该问题。
1、 思路当前流行的浏览器的系统选项中有一个参数,即“通过代理服务器连接”,经过编程测试,当局域网中一台工作站指定了该属性,再发出Internet请求时,请求数据将发送到所指定的代理服务器上,
以下为请求数据包示例:
GET http://www.baidu.com/ HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Host: www.baidu.com
Proxy-Connection: Keep-Alive
其中第一行为目标URL及相关方法、协议,“Host”行指定了目标主机的地址。由此知道了代理服务的过程:接收被代理端的请求、连接真正的主机、接收主机返回的数据、将接收数据发送到被代理端。为此可编写一个简单的程序,完成上述网络通信重定向问题。
用VC设计时,创建一个监听线程来接受浏览器发起的连接。编程时应解决的一个重要问题是多重连接处理问题,为了加快代理服务的速度和被代理端的响应速度,与web 服务端连接的socket采用异步方式来进行连接。通信的衔接过程如下所示:
1、浏览器发起socket连接到代理服务器
2、代理服务器监听线程接受浏览器的连接,创建一个新线程,同时将接受的socket与新线程绑定到一起。
3、新线程启动时,对该socket设置消息模式(我采用的是一个继承CAsyncSocket的类),并设置FD_CLOSE | FD_READ.同时,新线程向主线程发送一个登陆消息,把自己的线程ID报告给主线程(把线程ID报告给主线程,是因为在主线程有主界面,并设定一个定时器,通过主界面的定时器,向各个线程发送定时器消息,避免对每个线程都开启定时器,减少资源消耗) 4、在OnRecieve函数中读取浏览器发起的请求信息,进行分析,分析出目标主机和端口,根据http请求方式不同,作出不同的动作。目前只实现了http中GET和POST方法,同时只实现http1.1版本。处理POST方法时,需要获得消息的长度,即Content-Length的值,来判断POST的消息是否传输完毕。
5、当得到目的主机和端口时,新建socket连接到web server.这里有点需要注意,即浏览器可能会通过一个SOCKET给代理服务器发送不同的请求主机地址。所以,对这个socket我建立了一个socket队列,该队列的每个socket连接到不同主机。我是采用CAsyncSocket的继承类来作为socket队列的成员,并将该线程绑定的socket作为CAsyncSocket继承类的成员,同时通过WSAAsyncSelect来设置异步消息方式FD_READ | FD_CLOSE。对每个请求分析其目标地址,如果该地址之前连接过,目前连接还没断开,则继续用原来的连接。与web server的连接是采用异步方式,设定一个超时值,当连接超时时,代理服务器发送超时响应,并断开与浏览器的连接。连接成功后,就发送请求。剑道独尊
6、当接受到服务器的响应消息后,触发FD_READ消息,读取信息,并把消息通过socket成员发送到客户端浏览器这就是http代理服务器的服务过程。
后记由于这种设计思路仅仅在被代理端和远程主机之间增加了一个重定向功能,被代理端原有的缓存技术等特点均保留,因此效率较高。 通过该方式的实现,目前已经很适用项目的目的
分享到:
相关推荐
VC实现了一个功能简单的HTTP代理服务器
实现了一个功能简单的HTTP代理服务器,主要介绍多线程编程相关的知识,包括初始化临界段和删除临界段,使用临界段完成多个线程对临界资源的互斥访问,创建工作线程,退出工作线程,定义和设定事件,利用事件完成多个...
【标题】"VC编写的代理服务器程序"是一个基于Visual C++(VC)开发的网络应用程序,主要用于实现代理服务器的功能。代理服务器在计算机网络中扮演着重要角色,它充当客户端与目标服务器之间的中介,允许用户通过它来...
在描述中提到的"vc 实现的一个HTTP代理服务器的设计与实现",进一步确认了这个项目的核心是利用C++和VC++构建一个HTTP代理服务器。设计和实现通常涉及到服务器架构、请求处理、响应生成、网络通信等多个方面。HTTP...
压缩包子文件的文件名称列表中,"G2"可能是一个源代码文件或者二进制执行文件,而“一个用vc编写的代理服务器程序,可以很好地实现代理的所有功能,简单方便。”可能是源代码文件夹、项目文件或者包含程序说明的文档...
在VC++中实现HTTP代理服务器,我们需要涉及以下关键概念和技术: 1. **套接字编程**:这是网络编程的基础,通过套接字API与网络进行通信。在Windows系统中,通常使用Winsock库来实现套接字功能,处理TCP/IP连接。 ...
- Socket编程:CAsyncSocket类是实现HTTP代理服务器的核心,它负责创建套接字,监听客户端连接,接收和发送数据。 - 多线程:为了处理并发连接,代理服务器需要使用多线程技术,每个客户端连接都在单独的线程中...
以前上TCP/IP课程时做的课程设计,很小的一个HTTP代理服务器,基于socket编程。VC6.0环境的。原创程序。 那时候还是新手,程序很简陋,不过好歹能用。 学校学习相关课程的学生可以参考下,当个课程作业没问题,老手...
在描述中提到“可以很好地实现代理的所有功能,简单方便”,这表明该程序可能包含了常见的代理服务器特性,如HTTP代理、SOCKS代理,甚至可能支持FTP、SMTP等协议。它还强调了易用性和实用性,意味着用户可能无需复杂...
HTTP代理服务器作为客户端与目标服务器之间的中介,可以用于访问受限的网站,提升匿名性,或者集中管理网络流量。在这个过程中,客户端会发送请求到代理服务器,代理服务器再将请求转发给目标服务器,并将目标服务器...
在这个HTTP代理服务器的实现中,开发者可能需要解析接收到的HTTP请求,提取出必要的信息,如URL、HTTP方法和头部,然后构造新的HTTP请求并发送到目标服务器。同时,代理服务器还需要能够正确处理来自服务器的响应,...
每客户单线程实现http 代理服务器,参考网络资源,用VC6.0编写,满足网络程序设计课程的实验要求。
在VC中实现HTTP服务器,我们需要关注以下几个核心组件: 1. **网络编程**:VC提供了Winsock库,它是Windows上的一个网络编程接口,用于实现TCP/IP协议栈。我们需用到的函数包括`socket()`用于创建套接字,`bind()`...
HTTP代理服务器是一种网络服务,它允许客户端(如Web浏览器)通过该服务器与目标服务器进行通信。在本场景中,我们有一个名为"Http 代理服务器 (源码)"的项目,这是一个控制台应用程序,专为VC6(Visual C++ 6.0)...
4.1 缓存策略:为了加快访问速度,代理服务器可以实现缓存机制,对频繁访问的网页进行存储,当再次收到相同请求时,可以直接从缓存中读取,减少网络延迟。 4.2 安全性:代理服务器可以通过过滤非法请求,限制访问...
在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)进行网络程序设计,特别是构建TCP代理服务器。TCP代理服务器是网络通信中的一个重要组件,它允许客户端通过服务器中转与远程服务器之间的...
这个函数允许我们传递一个选项,如`INTERNET_OPTION_PROXY`,并提供一个结构体(如`WINHTTP_PROXY_INFO`)来指定代理服务器的信息,包括IP地址和端口号。 描述中提到“修改注册表来设置代理IP”,这是另一种常见的...
### VC简易代理服务器的设计(Socket编程) #### 摘要与背景 本文档主要介绍了一种简易代理服务器的设计与实现过程,特别关注了使用VC++(Visual C++)结合Socket编程来构建这一系统的具体方法。代理服务器作为一种...
本资源是基于VC++实现的一个简单HTTP代理服务器,通过解析和转发HTTP请求,展现了网络编程的基础概念和技术。 首先,我们要理解HTTP协议的基本原理。HTTP(超文本传输协议)是应用层协议,用于从Web服务器传输超...