Introduction
This program demonstrates the basic use of WinSock and multi-threading. Multi-threading is important especially for server-side programming, so an HTTP proxy server is a very good example to show how we can use multi-threading to improve performance.
Using the Code
The code contains only one source file for simplicity, and it's a console application. The proxy port is defined as 6666, and you can easily change the parameters at the beginning of the source code file (myproxy.cpp).
#define SPACE_CHAR ' '
#define PROXY_PORT 6666
#define RESPONSE_BUFFER_SIZE 8192
#define MAX_THREADS 50 //How many threads you want to have
queue<SOCKET> socketBuffer;
HANDLE queueMutex;
Points of Interest
An HTTP proxy server is thought to be easy, because you actually do nothing except pass the request and response around. However, it is not that easy to implement as we think.
With the popularity of AJAX techniques, more and more websites have adopted this technology, such as YouTube, Google Maps, Flickr... So what's the difference?
The difference is, these so called Web 2.0 websites actually generate a lot of concurrent connections than regular sites. In fact, each image file is transferred in an individual channel. Think about Google Maps, how many small images are there in each page? Each of them is going to create a connection (OK, actually the connection is generated from your HTTP client web browser, not from the server).
Another interesting point is the "keep-alive" option in the "Connnection: " field of the HTTP response. It means even if you cannot use recv()
to read any data, you should keep the connection open for future use. It's mostly used for websites like YouTube and other streaming video applications so the client could keep the connection open for later data transfer.
Sounds good? No. In my experiments, a lot of "badly-designed" websites send back "Connection: keep-alive" while they never send any data back... In this case, the solution is to set a timeout for the receiving action. Since recv()
doesn't have a timeout parameter, we need to use the Winsock extension WSARecv(...)
.
History
- First uploaded: 12/5/2007.