Click here to Skip to main content
15,867,308 members
Articles / Desktop Programming / Win32

A multi-threaded HTTP proxy server based on Win32

Rate me:
Please Sign up or sign in to vote.
3.22/5 (5 votes)
5 Dec 2007CPOL2 min read 56.3K   4.5K   36   6
Demostration of a multi-threaded HTTP proxy server implemented with WinSock on Windows.

Image 1

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).

C++
//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

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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questiona simple proxy server and proxy scanner in background to feed proxies to I.E Pin
Member 1100810728-Aug-14 4:17
Member 1100810728-Aug-14 4:17 
Questiona simple proxy server and proxy scanner in background to feed proxies to I.E Pin
Member 1100810712-Aug-14 4:37
Member 1100810712-Aug-14 4:37 
Generalprocessor usage Pin
viliam11-Sep-08 2:06
viliam11-Sep-08 2:06 
GeneralRe: processor usage Pin
Denis Panov16-Oct-08 22:51
Denis Panov16-Oct-08 22:51 
GeneralRe: processor usage Pin
mbaocha6-May-09 12:29
mbaocha6-May-09 12:29 
GeneralCool Pin
Anton Kukoba3-Sep-08 19:18
professionalAnton Kukoba3-Sep-08 19:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.