· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› Получение скорости инет соединения

Посл.отвђт Сообщенiе


Дата: Ноя 13, 2004 12:35:32

Hi all. Есть ли стандартные способы получения скорости соединения?


Дата: Ноя 14, 2004 03:17:13

MIB_IFROW STRUCT

wszName db 512 dup (?) ; имя интерфейса
dwIndex dd ? ;516 индекс интерфейса
dwType dd ? ;520 тип интерфейса
dwMtu dd ? ;524 максимальная скорость передачи
dwSpeed dd ? ;528 текущая скорость передачи в битах в секунду
dwPhysAddrLen dd ? ;532
bPhysAddr1 dd ?
bPhysAddr2 dd ? ;540 физический адрес интерфейса
dwAdminStatus dd ?
dwOperStatus dd ? ;548 Содержит текущий статус интерфейса
dwLastChange dd ? ;552
dwInOctets dd ? ;556 Всего принято байт через интерфейс
dwInUcastPkts dd ? ;560
dwInNUCastPkts dd ? ;564
dwInDiscards dd ? ;568
dwInErrors dd ? ;572
dwInUnknownProtos dd ? ;576
dwOutOctets dd ? ;580 Всего отправлено байт через интерфейс !!!!!
dwOutUCastPkts dd ? ;584
dwOutNUCastPkts dd ? ;588 количество ненаправленных пакетов отправленных интерфейсом
dwOutDiscards dd ? ;592 количество забракованных исходящих пакетов
dwOutErrors dd ? ;596 количество исходящих пакетов содержащих ошибки
dwOutQLen dd ? ;600
dwDescrLen dd ? ;604
bDescr db 256 dup (?) ;860 Наименование интерфейса (имя)
MIB_IFROW ENDS


invoke GlobalAlloc,GMEM_MOVEABLE,20480
mov [tcphand],eax
invoke GlobalLock,eax
mov [tcpmem],eax
mov [reqsize],20000
invoke GetIfTable,[tcpmem],addr reqsize,FALSE
mov esi,[tcpmem]
add esi,4
assume esi:PTR MIB_IFROW

а дальше уже понятно наверно ;)


Дата: Ноя 14, 2004 21:48:18

„а дальше уже понятно наверно ;)“

Чем дальше в лес, тем толще партизаны :(

Почему скорость соединения например с Инетом полученная этим способом, совпадает со значением, показываемым Виндой, а количество отправленного и принятого траффика - нет, например: принято [edx].dwInOctets = 56716, а Винда показывает принято 57324. И для отправленного тоже есть разница, только отправленного Винда показывает чуть меньше

Почему так?


Дата: Ноя 15, 2004 11:59:14

хм действительно так :) но я не знаю даже почему может всякие там пропинговки в счет не идут ?
да и принципиально ведь теряются даже не десятые а сотые процента а меня это устраивает


Дата: Ноя 15, 2004 14:44:22

BLOWFISH

Да это особо не мешает, просто хотелось знать, почему.

И ещё один момент, может подскажешь? В каком формате выводится время последнего установления соединения: FILETIME, MS-DOS Time или ещё что? Ни под какое что-то не подходит, в т.ч. и GetTickCount тоже...


Дата: Ноя 16, 2004 03:24:26

да я даже не вкурсе, както не интересовало, мне важно было только скорость и трафик а время я учитывал по другому.
посмотри в msdn может что найдешь.


Дата: Ноя 16, 2004 03:31:14

Блин, я его весь перерыл, все форматы времени посмотрел, ни на один не похоже :(((


Дата: Ноя 16, 2004 04:39:21

cresta
может это просто time_t? какие там числа обычно?


Дата: Ноя 16, 2004 05:18:39 · Поправил: cresta

Я тут на одном немецком форуме только что нарыл такую инфу:
dwLastChange 
Specifies the length of time, in centaseconds (10^-2 sec), 
that elapsed between January 1, 1601, and the last 
change of the operational status of the interface (connection). 
The value rolls over after 2^32 centaseconds.


Блин, это ж надо было так зашифровать :-\
Единица времени в 100000 раз крупнее FILETIME.dwLowDateTime плюс к тому же и rollover каждые примерно 497 дней :(( Т.е. у меня PrintDec [ebx].dwLastChange выдаёт на сегодняшний день и примерно на текущее время -1100862793. Теперь ещё надо попробовать подогнать под текущую дату. Маразма сплошная ... Трудно было им обычный FILETIME вставить.

Попробовал в FILETIME перевести, что-то не очень срастается


Дата: Ноя 16, 2004 05:31:45

а не легче ли будет крутиться в цикле пока нету соединения а когда оно повилось GetTickCount потом снова в цикле пока есть соединение и по окончании GetTickCount ?


Дата: Ноя 16, 2004 05:48:15

cresta
Крупнее она в 10000000 раз, FILETIME микрософт в наносекундах меряет ;)

Алгоритм перевода примерно такой:
GetSystemTimeAsFileTime(&time);
time/=10000000;//тут без 64х-битной арифметики не обойтись
if(time.low<dwLastChange)//событие у нас было в прошлом
    time.high--;//поэтому исправим старшую часть
time.low=dwLastChange;//ну а младшая часть у нас уже есть
time*=10000000;


Дата: Ноя 16, 2004 19:06:03

Black_mirror

По-моему ты ошибаешься, не в наносекундах, а 100 нс- интервалах:
The FILETIME data structure is a 64-bit value representing the number of 100-nanosecond intervals...

Так что наверное, все-таки 2 порядка надо скинуть, единица для FILETIME равна 10^-7, но не 10^-9

BLOWFISH

Можно конечно и так, но это несколько криво, да и необходимо все время программу крутить, чтобы не прозевать подключение


Дата: Ноя 16, 2004 19:34:47

cresta
Действительно ошибаюсь, я в какой-то книжке читал что в наносекундах меряется, нужно внимательно смотреть первоисточники 8)


Дата: Ноя 16, 2004 22:50:38

Сделал так (правда не с 64 битной арифметикой, а просто через FpuLib)
.data
    mulData    db   10 Dup (0)	;для исходного
    divData    db   10 Dup (0)	;для деленного на 100000
.code
    invoke GetSystemTimeAsFileTime,ADDR FTime
    lea eax,mulData
    m2m [eax],FTime.dwLowDateTime
    add eax,4
    m2m [eax],FTime.dwHighDateTime
    mov eax,100000
    invoke FpuDiv, ADDR mulData, eax, ADDR divData, SRC1_REAL or SRC2_DIMM
    lea eax,divData
    m2m FTime.dwLowDateTime,[eax]
    add eax,4
    m2m FTime.dwHighDateTime,[eax]
    mov ecx,FTime.dwLowDateTime
    cmp ecx,[ebx].dwLastChange
    jae @F
        dec FTime.dwHighDateTime
    @@:
    m2m FTime.dwLowDateTime,[ebx].dwLastChange
    m2m [eax],FTime.dwHighDateTime
    sub eax,4
    m2m [eax],FTime.dwLowDateTime
    mov eax,100000
    invoke FpuMul, ADDR divData, eax, ADDR mulData, SRC1_REAL or SRC2_DIMM
    invoke FileTimeToLocalFileTime,ADDR mulData,ADDR FTime
    invoke FileTimeToSystemTime,ADDR FTime,ADDR STime
    PrintDec STime.wHour
    PrintDec STime.wMinute
    PrintDec STime.wSecond
    PrintDec [ebx].dwLastChange


Дата: Ноя 17, 2004 17:48:39

invoke GlobalAlloc,GMEM_MOVEABLE,20480
mov [tcpmem],eax
invoke GlobalLock,eax
mov [tcpmem],eax
mov [reqsize],20000
invoke GetIfTable,[tcpmem],addr reqsize,FALSE
mov esi,[tcpmem]
add esi,4
assume esi:PTR MIB_IFROW
invoke MessageBox, 0, addr [esi].wszName, NULL, MB_OK

Сори, почему не работает? =)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.111