Есть функция GetIfEntry2, которая получает структуру MIB_IF_ROW2 с интересующим меня значением InOctets Проблема вот в чем, это количество за текущую сессию работы устройства. Например, если это модем (3G, 4G) то при подключении/отключении устройства, счетчик будет обнуляться. Допустим раз в 5 минут смотрим эту структуру 1. 235 мб 2. 242 мб 3. 0 4. 10 мб 5. 102 мб ... Вопрос - как в таких условиях подсчитать количество трафика например за день? Может как-то можно узнать время когда устройство было подключено...
Тоже хотел предложить 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
WM_DEVICECHANGE с этим работал в курсе Но допустим программа запускается уже после включения модема... Думалка после праздников не работает , в идеале я вижу такой алгоритм. 13:45 - 250мб ( последняя запись в реестре например) смотрим устройство запустилось в 13:50 количество трафика прошло 12мб, значит + смотрим устройство запустилось в 11:00 количество трафика прошло 520мб, значит обновляем запись в реестре... Делать прокси или сниффер какой там проще конечно трафик считать... но если есть возможность использовать 1 winAPI функцию, значит нужно придумать как ее использовать Можно конечно опрашивать, каждые 5-10 миллисекунд в потоке, но это имхо бред.
так подожди,я не пойму- коннект же в любом случае идет через одно устройство- либо карту либо модем,так?- тогда в чем проблема если программа запускается после того как всунут модем- чекаешь коннект и ловишь траф
Угу, я тоже не совсем уловил момент - ты же просто событие будешь отлавливать. Допустим у тебя была запись последняя в 13.50 - 40 мб траффа - хераксь событие дисконнекта и ты обновляешь запись.
Порыл MSDN на предмет отслеживания подключения. во первых в структуре есть поле MediaConnectState, которое и показывает подключен к сети он или нет... Но как мне сказал гугл МОЖНО отловить событие подключения/отключения от сети использовав SENS (System Event Notification Service), но это блин COM+ на Си в с ним работать очень проблематично... в общем нашел я как его можно использовать в статьи 2002 года System Event Notification Services and WMI Enable Flexible, Efficient Mobile Network Computing правда там автор предлагает использовать ATL (хотя без него COM писать сущий ад)... Кому интересно, могут рискнуть реализовать
Я честно говоря не понимаю, в чем проблема юзать все то что было в первом посте. Я когда писал что то типа Net Meter'а с графиками и т.д. Делал как - каждую секунду(график раз в секунду обновлялся) определяю то число(о котором в нулевом посте идет речь, сколько за сессию), смотрю значение секунду назад, уже по разнице можно и судить. Если новое значение меньше старого - значит произошло переподключение и это и будет разница. А разницу каждый раз суммируем и получаем сколько трафика всего вышло.
Дело в том, что в таком подходе есть существенный изьян - Дело во времени чека. ТЗ написал, что не хочет каждую секунду чекать значение (это впринципе и не есть гут для перформанса). А если чекать с интервалом, например в 5 минут, то необязательно, что новое значение будет меньше/больше старого. По сути - можно реализовать подход как в снифферах - постоянная прослушка коннектов и ревизия пакетов, однако, это как раз тот вариант, когда чекать нужно в while, то бишь постоянно.
В общем мне пока лень, но я обновил в памяти труды Рихтера - замутил потокам низкий приоритет IDLE, с помощью таймеров замутил расписание (что бы в определенное время запускались и умирали), а контроль выполнения основного цикла потока поручил event-у и таймеру. Основной поток это цикл с wait еvent-а с 5 секундым интервалом. Остается только заставить себя довести это до приемлемого вида Но пока диван и пиво берут верх над моим желанием писать бесполезные программы )
В общем начитавшись Рихтера, заюзал я функцию 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