-
День добрый.
Как можно в системе отловить создание/разрушение соединения какого-то процесса в системе?
т.е. грубо говоря в момент начала сетевой активности моей программе приходит сообщение об этом.
Сейчас я эту задачу выполняю так:
1. Отлавливаем сниффером все пакеты, проходящие через интерфейс. Соответственно получаем LocalAddress, LocalPort, RemoteAddress, RemotePort, direction. (уже сделано, работает на ура)
2. С помощью GetExtendedTCPTable получаем список активных соединений, в списке присутствует pID процесса для каждого соединения.
3. Сравниваем наш пакет с таблицев, находим процесс, которому пришёл данный пакет.
4. Пишем лог.
Всё работает тоже отлично, но при скорости передачи данных ~8 мегабит программка начинает давать неслабые тормоза, т.к. происходит частый вызов GetExtendedTCPTable (с отключенной функцией определения имени процесса для каждого пакета загрузка процессора не более 3%, с включенной - не менее 50%). Собственно пришла идейка вызывать функцию только тогда, когда в системе появляется или пропадает сетевое соединение, вот интересно как это можно cделать.
Поможете?)
-
> Strate (22.02.08 12:34)
О каких соединениях ты ведешь речь ?
-
> О каких соединениях ты ведешь речь ?
сетевые соединения. Можно сказать список открытых ллокальных сокетов.
P.S. Список можно посмотреть по 'netstat -n -b'
-
> список открытых ллокальных сокетов
Это далеко не сетевая активность.
-
> Это далеко не сетевая активность.
А что это? Без этого не понятно что мне надо?
-
> что это?
Это просто "список открытых ллокальных сокетов" и не более того.
А сетевая активность - это собственно прием/передача информации через сетевые интерфейсы.
-
Тогда мне надо событие (сообщение, нотификация), которое возникает при открытии нового сокета в системе.
-
Зачем ?
Прием/передача через интерфейс и есть сетевая активность. И это отслеживается сниффером. Зачем тебе какие-то там сокеты ?
-
ммм... я хочу по пришедшему мне пакету определять имя экзешника (если возможно) которому этот пакет пришёл. Я это сделал, но неэффективно, т.к. при каждом пакете вызывается GetExtendedTCPTable, что достаточно тормозит программу. (~50% времени процессора), причём больше чем уверен что бОльшая часть вызовов вхолостую - таблица активных процессов (выход функции GetExtendedTCPTable) не меняется (если к примеру качать файл каким-нить даунлоад-менеджером). Так вот ммне нужно что-то вроде события, которое возникает при появлении нового процесса (при открытии нового соединения уже сущетвующим процесом (например новый поток той же закачки)), дабы по этому событию вызывать GetExtendedTCPTable. Вот )
Возможно такое?
-
> события, которое возникает при появлении нового процесса
Это возможно реализовать только в драйвере решима ядра, на wasm.ru есть соотв.статья с примером
|