By capturing the Steam client's calls to the recv() API it should be possible
to measure (to a first approximation, minus TCP overhead) the incoming data
volume being used by aggregating all the recv() calls.
By taking this data and smoothing it to derive an approximate rate, it should
be possible to compute a delay factor if the incoming data rate exceeds a
nominated threshold. This delay can be applied in the recv() hook before
returning data to the caller.
In principle this could be made per-socket and perhaps tied to the bound peer
address, but in the first instance this should be useful as a global setting.
By making it global, some non-download traffic will be included (such as from
the internal web browser) but that shouldn't be too much of a problem.
By applying the delay once data has arrived it won't be quite as effective as
true bandwidth limiting, and of course thanks to TCP windowing over a
long-delay path the applied limit won't be smooth but be somewhat "lumpy",
although this shouldn't affect the purpose of preventing Steam from completely
saturating a downlink too badly. It may be necessary to watch out to see
whether the Steam client requests TCP window scaling or not, though, via
trapping some more APIs.
Note that this is one of the single most-requested enhancements to Steam there
is (see http://forums.steampowered.com/forums/showthread.php?t=731183 for just
one example, threads requesting this appear every few days).
Note that a related concept is simply the tracking of the Steam client's
aggregate data use persistently, for measuring use over the ISP billing cycle
as well (although this is less useful now that so many ISPs in countries with
metered billing are deploying their own unmetered servers).
Original issue reported on code.google.com by nigel.bree@gmail.com on 28 Dec 2011 at 4:30
Original issue reported on code.google.com by
nigel.bree@gmail.com
on 28 Dec 2011 at 4:30