Учет трафика

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gar|k, 7 Jan 2014.

  1. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Есть функция GetIfEntry2, которая получает структуру MIB_IF_ROW2 с интересующим меня значением InOctets
    Проблема вот в чем, это количество за текущую сессию работы устройства. Например, если это модем (3G, 4G) то при подключении/отключении устройства, счетчик будет обнуляться.

    Допустим раз в 5 минут смотрим эту структуру
    1. 235 мб
    2. 242 мб
    3. 0
    4. 10 мб
    5. 102 мб
    ...
    Вопрос - как в таких условиях подсчитать количество трафика например за день?

    Может как-то можно узнать время когда устройство было подключено...
     
    _________________________
    1 person likes this.
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    модем это usb устройство?-WMDEVICECHANGE
     
  3. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Тоже хотел предложить WM_DEVICECHANGE, вот схожий случай из гугла:
    Code:
    case WM_DEVICECHANGE:
    {
        if((UINT)wParam == DBT_DEVICEARRIVAL)
        {
            PDEV_BROADCAST_HDR pHDR = (PDEV_BROADCAST_HDR) lParam;
            
            if(pHDR->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                PDEV_BROADCAST_VOLUME pVOL = (PDEV_BROADCAST_VOLUME) pHDR;
                
                if(pVOL->dbcv_flags==1)break; //CD drive
                
                //NET or Drive
                int mask = pVOL->dbcv_unitmask;
                int drive=0;
                for(;mask;mask/=2)drive++;
                drive+=64;
                //PART 1
                char fpath[30],dpath[20];
                sprintf_s(dpath,5,"%c:\\",drive);// буква диска X:\
                
                if(GetDriveType(dpath)!=DRIVE_REMOVABLE)break; //Если это не USB или другое съемное устройство, то нафиг
                
             
               //Работем с dpath
    
            }
            return TRUE;
        }
    }
    break;
    
    А вот и пруф на схожую тему(линьк режится убери пробелы):
    http:// forum.codenet. ru/q71683/%D0%9A%D0%B0%D0%BA+%D0%BE%D1%82%D1%81%D0%BB%D0%B5%D0%B4%D0%B8%D1%82%D1%8C+%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5+USB+%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0?s=0#answer_374210
     
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    WM_DEVICECHANGE с этим работал в курсе :) Но допустим программа запускается уже после включения модема...
    Думалка после праздников не работает :) , в идеале я вижу такой алгоритм.

    13:45 - 250мб ( последняя запись в реестре например)
    смотрим устройство запустилось в 13:50 количество трафика прошло 12мб, значит +
    смотрим устройство запустилось в 11:00 количество трафика прошло 520мб, значит обновляем запись в реестре...

    Делать прокси или сниффер какой там проще конечно трафик считать... но если есть возможность использовать 1 winAPI функцию, значит нужно придумать как ее использовать :) Можно конечно опрашивать, каждые 5-10 миллисекунд в потоке, но это имхо бред.
     
    _________________________
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    так подожди,я не пойму- коннект же в любом случае идет через одно устройство- либо карту либо модем,так?- тогда в чем проблема если программа запускается после того как всунут модем- чекаешь коннект и ловишь траф
     
    1 person likes this.
  6. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Угу, я тоже не совсем уловил момент - ты же просто событие будешь отлавливать.
    Допустим у тебя была запись последняя в 13.50 - 40 мб траффа - хераксь событие дисконнекта и ты обновляешь запись.
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Порыл MSDN на предмет отслеживания подключения.
    во первых в структуре есть поле MediaConnectState, которое и показывает подключен к сети он или нет...

    Но как мне сказал гугл МОЖНО отловить событие подключения/отключения от сети использовав SENS (System Event Notification Service), но это блин COM+ на Си в с ним работать очень проблематично... в общем нашел я как его можно использовать в статьи 2002 года System Event Notification Services and WMI Enable Flexible, Efficient Mobile Network Computing правда там автор предлагает использовать ATL (хотя без него COM писать сущий ад)...

    Кому интересно, могут рискнуть реализовать :)
     
    _________________________
  8. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Я честно говоря не понимаю, в чем проблема юзать все то что было в первом посте. Я когда писал что то типа Net Meter'а с графиками и т.д. Делал как - каждую секунду(график раз в секунду обновлялся) определяю то число(о котором в нулевом посте идет речь, сколько за сессию), смотрю значение секунду назад, уже по разнице можно и судить. Если новое значение меньше старого - значит произошло переподключение и это и будет разница. А разницу каждый раз суммируем и получаем сколько трафика всего вышло.
     
  9. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Дело в том, что в таком подходе есть существенный изьян - Дело во времени чека. ТЗ написал, что не хочет каждую секунду чекать значение (это впринципе и не есть гут для перформанса). А если чекать с интервалом, например в 5 минут, то необязательно, что новое значение будет меньше/больше старого.
    По сути - можно реализовать подход как в снифферах - постоянная прослушка коннектов и ревизия пакетов, однако, это как раз тот вариант, когда чекать нужно в while, то бишь постоянно.
     
  10. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    В общем мне пока лень, но я обновил в памяти труды Рихтера - замутил потокам низкий приоритет IDLE, с помощью таймеров замутил расписание (что бы в определенное время запускались и умирали), а контроль выполнения основного цикла потока поручил event-у и таймеру. Основной поток это цикл с wait еvent-а с 5 секундым интервалом.

    Остается только заставить себя довести это до приемлемого вида :) Но пока диван и пиво берут верх над моим желанием писать бесполезные программы )
     
    _________________________
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    В общем начитавшись Рихтера, заюзал я функцию CreateTimerQueueTimer и избавился от Event и прочих ядерных функций. Что бы программа не затрачивала драгоценные такты процессора на переход из пользователького уровня на уровень ядра.

    Узнал так же про существование HTTP Server API, который позволяет замутить веб интерфейс!
    HTML страничку я запихнул в ресурсы и при GET запросе вытаскиваю ее от туда. При POST запросах (в зависимости от URL) формируются разные JSON ответы. Если кто знаком с HTML и JS уже поняли, что я заюзал технологию AJAX для получения данных из программы.

    Подрубил SQLite и записываю данные о трафике в БД.
    Хотел заюзать http://www.amcharts.com/javascript-charts/, для вывода красивой статистики, но чет библиотека больно жиная (пока моя прога в релизе весит 500кб). Так что буду сам придумывать на HTML5 Canvas и JS.

    Код получился не очень красивым, но ближайшее время выложу в github, ради примера создания веб интерфейса без COM и ActiveX
     
    _________________________
  12. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    https://github.com/Garik-/NetworkTraffic

    На этом я заканчиваю свою ЖЖешчку.
     
    _________________________