Click here to Skip to main content
13,861,184 members
Click here to Skip to main content
Add your own
alternative version


36 bookmarked
Posted 4 Dec 2007
Licenced CPOL

A multi-threaded HTTP proxy server based on Win32

, 5 Dec 2007
Rate this:
Please Sign up or sign in to vote.
Demostration of a multi-threaded HTTP proxy server implemented with WinSock on Windows.


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

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


  • First uploaded: 12/5/2007.


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


About the Author

United States United States
No Biography provided

You may also be interested in...

Comments and Discussions

Questiona simple proxy server and proxy scanner in background to feed proxies to I.E Pin
Member 1100810728-Aug-14 5:17
memberMember 1100810728-Aug-14 5:17 
Questiona simple proxy server and proxy scanner in background to feed proxies to I.E Pin
Member 1100810712-Aug-14 5:37
memberMember 1100810712-Aug-14 5:37 
Generalprocessor usage Pin
viliam11-Sep-08 3:06
memberviliam11-Sep-08 3:06 
GeneralRe: processor usage Pin
Denis Panov16-Oct-08 23:51
memberDenis Panov16-Oct-08 23:51 
GeneralRe: processor usage Pin
mbaocha6-May-09 13:29
membermbaocha6-May-09 13:29 
GeneralCool Pin
Hexxxxx3-Sep-08 20:18
memberHexxxxx3-Sep-08 20: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.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web04 | 2.8.190214.1 | Last Updated 5 Dec 2007
Article Copyright 2007 by zlike
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid