Конференция "Сети" » Отловить открытие (закрытие) соединения
 
  • Strate (22.02.08 12:34) [0]
    День добрый.

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

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

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

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

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

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

    4. Пишем лог.

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

    Поможете?)
  • Сергей М. © (22.02.08 12:56) [1]

    > Strate   (22.02.08 12:34)


    О каких соединениях ты ведешь речь ?
  • Strate (22.02.08 14:37) [2]

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


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

    P.S. Список можно посмотреть по 'netstat -n -b'
  • Сергей М. © (22.02.08 14:54) [3]

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


    Это далеко не сетевая активность.
  • Strate (22.02.08 15:29) [4]

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


    А что это? Без этого не понятно что мне надо?
  • Сергей М. © (22.02.08 15:33) [5]

    > что это?


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

    А сетевая активность - это собственно прием/передача информации через сетевые интерфейсы.
  • Strate (22.02.08 16:19) [6]
    Тогда мне надо событие (сообщение, нотификация), которое возникает при открытии нового сокета в системе.
  • Сергей М. © (22.02.08 16:21) [7]
    Зачем ?

    Прием/передача через интерфейс и есть сетевая активность. И это отслеживается сниффером. Зачем тебе какие-то там сокеты ?
  • Strate (22.02.08 16:29) [8]
    ммм... я хочу по пришедшему мне пакету определять имя экзешника (если возможно) которому этот пакет пришёл. Я это сделал, но неэффективно, т.к. при каждом пакете вызывается GetExtendedTCPTable, что достаточно тормозит программу. (~50% времени процессора), причём больше чем уверен что бОльшая часть вызовов вхолостую - таблица активных процессов (выход функции GetExtendedTCPTable) не меняется (если к примеру качать файл каким-нить даунлоад-менеджером). Так вот ммне нужно что-то вроде события, которое возникает при появлении нового процесса (при открытии нового соединения уже сущетвующим процесом (например новый поток той же закачки)), дабы по этому  событию вызывать GetExtendedTCPTable. Вот )

    Возможно такое?
  • Сергей М. © (23.02.08 11:29) [9]

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


    Это возможно реализовать только в драйвере решима ядра, на wasm.ru есть соотв.статья с примером
 
Конференция "Сети" » Отловить открытие (закрытие) соединения
Есть новые Нет новых   [134431   +14][b:0][p:0]