一个基于 Win32 的多线程 HTTP 代理服务器
演示了一个基于 WinSock 在 Windows 上实现的、多线程 HTTP 代理服务器。
引言
该程序演示了 WinSock 和多线程的基本用法。多线程对于服务器端编程尤其重要,因此 HTTP 代理服务器是一个很好的例子,可以展示我们如何使用多线程来提高性能。
Using the Code
为了简单起见,代码仅包含一个源文件,并且是一个控制台应用程序。代理端口定义为 6666,您可以很容易地在源代码文件(myproxy.cpp)的开头更改参数。
//just define the space character
#define SPACE_CHAR ' '
// port for proxy server, you can change it to whatever
#define PROXY_PORT 6666
//The buffer size is for reading from the remote host
//where you are getting the HTTP response
#define RESPONSE_BUFFER_SIZE 8192
#define MAX_THREADS 50 //How many threads you want to have
//global variable, all incoming socket connection is put to the queue
queue<SOCKET> socketBuffer;
HANDLE queueMutex;
//mutex for the queue
关注点
HTTP 代理服务器被认为很容易,因为你实际上什么都不做,只是传递请求和响应。然而,实现起来并不像我们想象的那么容易。
随着 AJAX 技术越来越流行,越来越多的网站采用了这项技术,例如 YouTube、Google 地图、Flickr... 那么有什么区别呢?
区别在于,这些所谓的 Web 2.0 网站实际上会生成比普通网站更多的并发连接。事实上,每个图像文件都在一个单独的通道中传输。想想 Google 地图,每页有多少小图像?它们中的每一个都会创建一个连接(好的,实际上连接是由你的 HTTP 客户端 Web 浏览器生成的,而不是由服务器生成的)。
另一个有趣的方面是 HTTP 响应的“Connnection: ”字段中的“keep-alive”选项。这意味着即使你无法使用 recv()
读取任何数据,你也应该保持连接打开以供将来使用。它主要用于像 YouTube 和其他流媒体视频应用程序这样的网站,以便客户端可以保持连接打开以进行后续数据传输。
听起来不错?不。在我的实验中,许多“设计不良”的网站会回发“Connection: keep-alive”,但它们从不发送任何数据回来……在这种情况下,解决方案是为接收操作设置超时。由于 recv()
没有超时参数,我们需要使用 Winsock 扩展 WSARecv(...)
。
历史
- 首次上传:2007/12/5。