Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отловить открытие (закрытие) соединения


Strate ©   (2008-02-22 12:34:00) 

День добрый.

Как можно в системе отловить создание/разрушение соединения какого-то процесса в системе?

т.е. грубо говоря в момент начала сетевой активности моей программе приходит сообщение об этом.

Сейчас я эту задачу выполняю так:

1. Отлавливаем сниффером все пакеты, проходящие через интерфейс. Соответственно получаем LocalAddress, LocalPort, RemoteAddress, RemotePort, direction. (уже сделано, работает на ура)

2. С помощью GetExtendedTCPTable получаем список активных соединений, в списке присутствует pID процесса для каждого соединения.

3. Сравниваем наш пакет с таблицев, находим процесс, которому пришёл данный пакет.

4. Пишем лог.

Всё работает тоже отлично, но при скорости передачи данных ~8 мегабит программка начинает давать неслабые тормоза, т.к. происходит частый вызов GetExtendedTCPTable (с отключенной функцией определения имени процесса для каждого пакета загрузка процессора не более 3%, с включенной - не менее 50%). Собственно пришла идейка вызывать функцию только тогда, когда в системе появляется или пропадает сетевое соединение, вот интересно как это можно cделать.

Поможете?)


Сергей М.   (2008-02-23 11:29:00) [1]


> события, которое возникает при появлении нового процесса


Это возможно реализовать только в драйвере решима ядра, на wasm.ru есть соотв.статья с примером


Strate   (2008-02-22 16:29:00) [2]

ммм... я хочу по пришедшему мне пакету определять имя экзешника (если возможно) которому этот пакет пришёл. Я это сделал, но неэффективно, т.к. при каждом пакете вызывается GetExtendedTCPTable, что достаточно тормозит программу. (~50% времени процессора), причём больше чем уверен что бОльшая часть вызовов вхолостую - таблица активных процессов (выход функции GetExtendedTCPTable) не меняется (если к примеру качать файл каким-нить даунлоад-менеджером). Так вот ммне нужно что-то вроде события, которое возникает при появлении нового процесса (при открытии нового соединения уже сущетвующим процесом (например новый поток той же закачки)), дабы по этому  событию вызывать GetExtendedTCPTable. Вот )

Возможно такое?


Сергей М.   (2008-02-22 16:21:00) [3]

Зачем ?

Прием/передача через интерфейс и есть сетевая активность. И это отслеживается сниффером. Зачем тебе какие-то там сокеты ?


Strate   (2008-02-22 16:19:00) [4]

Тогда мне надо событие (сообщение, нотификация), которое возникает при открытии нового сокета в системе.


Сергей М.   (2008-02-22 15:33:00) [5]


> что это?


Это просто "список открытых ллокальных сокетов" и не более того.

А сетевая активность - это собственно прием/передача информации через сетевые интерфейсы.


Strate   (2008-02-22 15:29:00) [6]


> Это далеко не сетевая активность.


А что это? Без этого не понятно что мне надо?


Сергей М.   (2008-02-22 14:54:00) [7]


> список открытых ллокальных сокетов


Это далеко не сетевая активность.


Strate   (2008-02-22 14:37:00) [8]


> О каких соединениях ты ведешь речь ?


сетевые соединения. Можно сказать список открытых ллокальных сокетов.

P.S. Список можно посмотреть по 'netstat -n -b'


Сергей М.   (2008-02-22 12:56:00) [9]


> Strate   (22.02.08 12:34)


О каких соединениях ты ведешь речь ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо