Click here to Skip to main content
6,633,937 members and growing! (22,529 online)
Email Password   helpLost your password?
General Programming » Internet / Network » Internet     Intermediate License: The Code Project Open License (CPOL)

Bandwidth throttling

By P.J. van de Sande

Save bandwidth and get QoS with bandwidth throttling.
C# 1.0, C# 2.0, Windows, .NET CF, .NET 1.0, .NET 1.1, .NET 2.0, ASP.NET, WinForms, VS.NET2003, VS2005, Dev
Posted:2 Apr 2007
Updated:2 Apr 2007
Views:43,151
Bookmarked:68 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
39 votes for this article.
Popularity: 7.17 Rating: 4.51 out of 5
1 vote, 2.6%
1

2
2 votes, 5.1%
3
10 votes, 25.6%
4
26 votes, 66.7%
5

Screenshot - screen.jpg

Introduction

Hosting a website can be fun. But, when you offer big downloads or streaming media, you do not want a visitor to eat up the full bandwidth. Or, maybe, you want to offer a premium account from where users can download without limitation, and a free account where users cannot download faster than 50 kb/s. Here is where throttling comes in.

Bandwidth throttling helps provide quality of service (QoS) by limiting network congestion and server crashes. For example, you make sure a connection does not get more than an X number of bytes per second.

The purpose of this article is to show how to use bandwidth throttling, with a small helper class.

Using the code

Within the source code, you will find a class named ThrottledStream. This class is derived from the abstract Stream that can be found in the System.IO namespace. In the constructor, it accepts a base stream to throttle. Here is a small line of code that shows how to instantiate a ThrottledStream:

Stream throttledStream = new ThrottledStream(Response.OutputStream, 1024);

Now, everything you do with the throttledStream will be limited to 1024 bytes per second, and will be send to or read from the OutputStream that is a member of the Response property that exists within an ASP.NET page.

Because the ThrottledStream is derived from the abstract Stream class, it is easy to add throttling to an existing application or website. For example, when you have a process that sends file content over a Stream and you want to enable bandwidth throttling, you only have to change the initialization of the destination stream.

The old code can look like this:

Stream sourceStream;
Stream destinationStream;

try
{
    sourceStream = new FileStream(@"c:\myfile.bin", 
                       FileMode.Open, FileAccess.Read, FileShare.Read);
    destinationStream = new NetworkStream(mySocket, false);

    byte[] buffer = new byte[1024];
    int readCount = sourceStream.Read(buffer, 0, BufferSize);

    while (readCount > 0)
    {
        destinationStream.Write(buffer, 0, readCount);
        readCount = sourceStream.Read(buffer, 0, BufferSize);
    }
}
finally
{
    if (destinationStream != null)
    {
        destinationStream.Close();
    }
 
    if (sourceStream != null)
    {
        sourceStream.Close();
    }
}

Now, we can easily add throttling support to this process. We only need to change the initialization:

...

Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, 51200);

...

By adding only one line of code, this full process is throttled to 50 kb/s (51200 b/s). Now, we go even a step further and add throttling that is based on a membership:

...

long bps;

switch( user.Membership )
{
    case MembershipLevel.Bronze:
        bps = 51200;
        break;

    case MembershipLevel.Silver:
        bps = 102400;
        break;

    case MembershipLevel.Gold:
        bps = 153600;
        break;

    case MembershipLevel.Platina:
        bps = ThrottledStream.Infinite;
        break;
}

Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, bps);

...

Here, we have a situation where a Bronze membership will give you 50 kb/s, Silver 100 kb/s, Gold 150 kb/s, and Platina infinitive - no throttling.

Points of interest

Bandwidth throttling can improve the QoS of your server, and allows you to control the bandwidth for a specified connection. The helper class named ThrottledStream is very easy to use, and can be used in existing scenarios.

License

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

About the Author

P.J. van de Sande


Member
Pieter Joost is a sr. IT consultant at Sogyo. He is recently awarded as Microsoft Visual C# MVP. He's active in the software development community as a speaker and boardmember of devnology.nl and dotned.nl
Occupation: Architect
Company: Sogyo
Location: Netherlands Netherlands

Other popular Internet / Network articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 42 (Total in Forum: 42) (Refresh)FirstPrevNext
GeneralThanks ! PinmemberAhmed Charfeddine2:17 1 Jun '09  
GeneralIt works! Pinmemberdimitris.dpant15:41 8 May '09  
GeneralRe: It works! Pinmemberdimitris.dpant0:09 16 May '09  
GeneralRe: It works! PinmemberGoran___3:54 20 Aug '09  
QuestionCan I adjust the bit rate on the fly? Pinmemberebonnett7:22 29 Apr '09  
GeneralIdle for a while after creating ThrottledStream constructor PinmemberSchoonMan9:07 14 Oct '08  
GeneralNice and idea to an improvement. Pinmemberleandrobecker11:31 25 Jul '08  
GeneralError with StreamReader.ReadLine PinmemberMember 35721416:10 26 Jun '08  
GeneralA few changes to improve accuracy especially on a Read() Pinmemberdeepsquatter7:10 22 May '08  
GeneralExcellent Pinmemberroyal_roi11:07 25 Mar '08  
Generalwhen will you reset time and bytecount? Pinmembertim40819:21 30 Jan '08  
GeneralIs this really a throttling technique? PinmemberKelmen Wong0:20 28 Sep '07  
QuestionRe: Is this really a throttling technique? PinmemberP.J. van de Sande1:51 28 Sep '07  
GeneralGeneral throttling PinmemberBit-Smacker8:59 17 Aug '07  
Generalone small bug PinmemberFelixWatts13:16 15 Jul '07  
GeneralRe: one small bug - another one PinmemberAndrewSmith20:08 21 May '09  
GeneralThanks - I used it. PinmemberFelixWatts9:37 15 Jul '07  
QuestionI'm sorry to say the solution is NOT correct PinmemberSoldierQ0:02 10 Apr '07  
AnswerRe: I'm sorry to say the solution is NOT correct PinmemberP.J. van de Sande1:19 10 Apr '07  
GeneralRe: I'm sorry to say the solution is NOT correct PinmemberSoldierQ18:02 10 Apr '07  
GeneralRe: I'm sorry to say the solution is NOT correct PinmemberAndrewSmith20:12 21 May '09  
AnswerRe: I'm sorry to say the solution is NOT correct PinmemberPaul A. Howes6:40 10 Apr '07  
GeneralRe: I'm sorry to say the solution is NOT correct PinmemberP.J. van de Sande10:23 10 Apr '07  
General5 stars code Pinmemberntorrisi9:42 4 Apr '07  
GeneralRe: 5 stars code PinmemberP.J. van de Sande21:55 4 Apr '07  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 2 Apr 2007
Editor: Smitha Vijayan
Copyright 2007 by P.J. van de Sande
Everything else Copyright © CodeProject, 1999-2009
Web21 | Advertise on the Code Project