среда, 11 ноября 2009 г.

Все гениальное просто

Решил рассказать, как на своем опыте столкнулся с верностью этого высказывания.

Шел 2002 год. Первый курс университета.  В городе рассвет компьютерных клубов. Для одного из которых я написал программу, для управления и учета средств. Первая моя более менее серьёзная программа, испытываемая в таких масштабах. Но как ни странно все вроде бы работало.
Все хорошо, все замечательно. Но приходит день X . Рядовому игроку мало игр по локалке. Нужен доступ в интернет и игры по интернету. Как раз появился Warcraft 3, и битвы на Battle.net завладели умами игроков.
Начальством поставлена задача  - реализовать в программе возможность подсчета и блокировки интернет-трафика.
В тот период, программ для компьютерных клубов, которые продавались в интернете, было не так много. А уж считающих трафик - одна/две. Те что работали с трафиком, реализовали это через работу с сервером на linux. Он считал и блокировал интернет. Для меня же Linux тогда был  священной коровой. Программировать под него даже и мысли не было. Нужно было найти решение под Windows ( в тот момент Windows 98).

Поиски в интернете приводили только к одному - надо писать драйвер для Windows. На этом фоне перспектива использования Linux ,  была более радужной. Но в итоге, половину задачи удалось решить с помощью драйвера WinPCap. Он как раз таки позволял считать трафик на локальной машине. Нашлись и примеры использования его на Delphi. Использование его показало, что считает примерно правильно, не учитывая видимо некоторый служебный трафик. Но такого результата было достаточно.

Подсчет подсчетом, а блокировать трафик надо. Попалась на глаза следующая идея. Можно получить список открытых сетевых сессий, как программа netstat, а потом каждое соединение убить. Все это делать в цикле, т.к. новые соединения появлялись периодически. Был найден пример кода, и реализовано в программе. Радость была безмерной, работало, считало, блокировало... но не все блокировало. Например, в Counter-Strike можно было играть вечно. Трафик не блокировался. Оказывается UDP пакеты не блокировались моим методом. Облом был сильным. Всяко пробовал, но трафик не блокировался.

Не помню уже как мне пришла эта мысль,  решение было очень простым и действенным. Нужно было просто посмотреть как работает сеть. Чтобы попасть в интернет, пакеты должны попасть на шлюз. А если шлюза нет - нет и интернета. ЭВРИКА!!! Просто удаляем шлюз по умолчанию и интернета нет. Добавляем шлюз - интернет есть. За это отвечает команда 
route delete
и 
route add
Все работало как часы.

Казалось бы, задача реально сложная, а решается в пару строк кода. Возможно решение покажется корявым, но оно работало. Кстати, даже на современных ОС оно будет работать.

0 коммент.:

Отправить комментарий