Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > RASGetLinkStatistics


Автор: bems 3.8.2006, 14:23
Добрый день. У меня такая проблема. Я пытаюсь пощитать количество байт, переданных и принятых моим модемом за секунду. Делаю так:
Код

stats.dwSize:=SizeOf(stats);
        if RasGetLinkStatistics(EntryHandle,SubEntry,@stats)=0
           then begin
                UsedBps:=round(((stats.dwBytesXmited+stats.dwBytesRcved-BytesIn-BytesOut)*8)/
                               ((stats.dwConectionDuration-time)/1000));
                time:=stats.dwConectionDuration;
                BytesIn:=stats.dwBytesRcved;
                BytesOut:=stats.dwBytesXmited;
                writeln(UsedBps);
                end;

И это все в таймере с интервалом 1с.


(stats.dwBytesXmited+stats.dwBytesRcved-BytesIn-BytesOut)*8 должно давать количество бит за интервал
((stats.dwConectionDuration-time)/1000 должно быть длиной интервала в секундах, то есть близко к 1.

Проблема в том, что иногда значение UsedBps становиться несколько большим, чем stats.dwBps

Или я считать не умею, или не правильно понимаю значения, которыми заполняет структуру функция
RasGetLinkStatistics.
В любом случае прошу ткнуть меня носом. Спасибо.

Автор: dumb 3.8.2006, 16:08
брр.. непонятно в чем непонятки. smile
ты же считаешь мгновенное(в течение последней секунды) значение bps, а dwBps считается с момента установления линка.

Автор: bems 3.8.2006, 17:21
Цитата(dumb @  3.8.2006,  16:08 Найти цитируемый пост)
dwBps считается с момента установления линка.
Насколько я знаю оно вообще не считается. До него договариваются железяки в процессе дозвона. И поэтому (как мне кажеться), за секунду не можт быть больше чем это значение. 

Иначе почему dwBps не меняется в процессе всего соединения?

Автор: dumb 3.8.2006, 17:45
пардон, доку прочитал неверно. smile
тогда тут может быть только одна причина - сжатие. передаешь мег текста, протокол жмет до 10 кил - получаешь превышение установленной при хэндшейке величины bps. кстати, точно уже не помню, но вроде бывает(в зависимости от настроек), что после ретрейнов устанавливается скорость выше, чем была при установлении соединения.

Автор: mai62 4.8.2006, 00:11
bems
Цитата(bems @  3.8.2006,  14:23 Найти цитируемый пост)
(stats.dwBytesXmited+stats.dwBytesRcved-BytesIn-BytesOut)*8 должно давать количество бит за интервал

Мне кажется, тут есть две ошибки:
1. нельзя складывать принятые байты и переданные (что-то одно, ведь прием и передача могут идти параллельно);
2. нужно умножать не на 8, а на 10 (если не на 11), ведь кроме 8 бит данных есть еще стартовый и как минимум один стоповый биты.

Автор: bems 4.8.2006, 08:43
Цитата(dumb @  3.8.2006,  17:45 Найти цитируемый пост)
тогда тут может быть только одна причина - сжатие. 

у меня dwCompressionRatioIn, dwCompressionRatioOut - нули
Цитата(mai62 @  4.8.2006,  00:11 Найти цитируемый пост)
1. нельзя складывать принятые байты и переданные (что-то одно, ведь прием и передача могут идти параллельно);

И что из них ограничено dwBps? То есть имеется в виду, что можно dwBps читать в это же время столькоже пересылать? не понял ничего...
Цитата(mai62 @  4.8.2006,  00:11 Найти цитируемый пост)
2. нужно умножать не на 8, а на 10 (если не на 11), ведь кроме 8 бит данных есть еще стартовый и как минимум один стоповый биты. 
Ну если это единственная ошибка, то я получу еще большее число в результате, и тогда срвсем крышей тронусь, а если вместе с номером один... то какое точное число бит для пересылки одного байта?

Добавлено @ 08:50 
Цитата(dumb @  3.8.2006,  17:45 Найти цитируемый пост)
вроде бывает(в зависимости от настроек), что после ретрейнов устанавливается скорость выше, чем была при установлении соединения. 
поподробнее, плиз. Или хоть ссылочку

Автор: mai62 4.8.2006, 09:36
Цитата(bems @  4.8.2006,  08:43 Найти цитируемый пост)
И что из них ограничено dwBps? То есть имеется в виду, что можно dwBps читать в это же время столькоже пересылать? не понял ничего...

Да. Исторически сложилось, что первые модемы подключались через последовательный порт, в котором есть отдельная физическая линия для передачи данных и отдельная для приема (и работать они могут одновременно). dwBps определяет скорость передачи данных по каждой из этих линий. Поэтому надо считать кол-во прошедших байтов по каждой из этих линий (каждому направлению передачи данных) отдельно.

Автор: bems 4.8.2006, 10:09
Цитата(mai62 @  4.8.2006,  09:36 Найти цитируемый пост)
 Поэтому надо считать кол-во прошедших байтов по каждой из этих линий (каждому направлению передачи данных) отдельно.
Не надо. Надо знать, что это не ошибка расчетов. А ошибка есть только если мои UsedBps>dwBps*2, я правильно понял?

Автор: dumb 4.8.2006, 14:00
Цитата(bems @  4.8.2006,  08:43 Найти цитируемый пост)
у меня dwCompressionRatioIn, dwCompressionRatioOut - нули

ну, для начала, это таки относящиеся к софтовому сжатию переменные. я же говорил про хардовое.
а по поводу подсчета - умножать надо на 8, ибо стоповые биты и четности всякие - это из другой оперы. каким образом и сколько бит используется для передачи одного байта модемом в линии нам не сильно интересно - это сугубо его(модема) лично дело.
режим передачи (дуплекс или симплекс) определяется настройками хардового протокола соединения.

так что, похоже, надо просто выводить link bps, in bps, out bps.

ps. могу ошибаться - давно дело было... user posted image

Добавлено @ 14:02 
опять же, есть подозрение, что значение dwBps(как и то, что выдает модем при соединении) является условным и приблизительным.

Автор: bems 4.8.2006, 14:40
Цитата(dumb @  4.8.2006,  14:00 Найти цитируемый пост)
опять же, есть подозрение, что значение dwBps(как и то, что выдает модем при соединении) является условным и приблизительным. 
не понял этой фразы. У меня есть два варианта толкования
а) то, что выдает модем при соединении является условным и приблизительным. есть подозрение, что значение dwBps тоже.
б) есть подозрение, что эти значения условны и приблизительны.

Насколько я знаю, dwBps это и есть то что выдает модем в строке CONNECT. Поэтому если ты имел ввиду вариант а, то расскажи пожалуйста о "то, что выдает модем при соединении" или дай ссылку. Что должно означать это значение, если оно условно и приблизительно. Не думаю ,что оно предназначено только для вывода пользователю.

Автор: dumb 4.8.2006, 15:31
не сказал точно, потому что не работал с этими функциями и не видел значений dwBps.

вариант а. цифра, указываемая модемом в строке коннекта является характеристикой скорости, а не точным значением пропускной способности. тебя не смущает тот факт, что эти цифры из таблицы и всегда округленные? - 9600,12000,14400,16800,19200,21600 итд итп.
реальная скорость может быть как ниже(помехи, ретрейн с понижением), так и выше(сжатие, ретрейн с повышением(?)).

ссылки не дам, ибо нет их у меня. зато в гугле есть. smile

ps. для меня остается загадкой, какую именно правду ты ищешь и зачем она тебе... user posted image

Автор: mai62 5.8.2006, 00:32
Цитата(bems @  4.8.2006,  10:09 Найти цитируемый пост)
Надо знать, что это не ошибка расчетов. А ошибка есть только если мои UsedBps>dwBps*2, я правильно понял?

Думаю надо считать отдельно и сравнивать каждое значение с dwBps.

Цитата(dumb @  4.8.2006,  15:31 Найти цитируемый пост)
тебя не смущает тот факт, что эти цифры из таблицы и всегда округленные? - 9600,12000,14400,16800,19200,21600 итд итп.

Это не что иное как стандартные скорости обмена по последовательному порту. Конечно, они задают не реальную скорость обмена, а максимально достижимую. А точнее, это значение задает ожидаемую длительность одного бита как t=1/speed (именно это важно поскольку обмен по последовательному порту асинхронный и представление о длине бита должно быть приблизительно (+-5%) равным у обоих участников обмена (в данном случае модема и компьютера)).

Автор: bems 5.8.2006, 11:19
спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)