Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ограничение скорости [Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3

SPeller ©   (2003-08-27 08:25:00) 

Извиняюсь, если мой вопрос уже был, но ни в поиске, ни в faq я ответа не нашёл.
Можно ли и как ограничить скорость Socket-соединения, работающего на HTTP протоколе?
Мне для отладки надо гонять загрузку файлов по HTTP протоколу, а при использовании Apache скорость соединения с localhost просто зверская :) и ничего визуально отследить не удаётся. А гонять гигабайты возможности нет.


Reindeer Moss Eater   (2003-08-27 10:34:00) [21]

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

Ну так извлекать-то их из буфера для уровня приложения никто насильно без задержки не заставляет.


Digitman   (2003-08-27 10:28:00) [22]


> SPeller


в OnRead() считываешь данные, переданные Апачем, целиком или фрагментами (как это предусмотрено твоим алгоритмом), если надо - делаешь их препарсинг, анализ и т.п..... результат приема/обработки поступающего потока (!!) данных записываешь в хвост некой очереди

по таймеру из головы той же очереди выбираешь нужного размера блок данных для передачи в браузер

если таймер "тикает", скажем, 1 раз в секунду, то при выборке из головы очереди всякий раз при "тике" данных размером, скажем, не более 3 кб, ты как раз и получишь среднюю скорость получения данных браузером не более 3 кб/сек


SPeller   (2003-08-27 10:19:00) [23]

Ладно, пусть TCP/IP, как мне заставить это дело ждать?


Verg   (2003-08-27 10:17:00) [24]


> Так... В тупик пришли? Как же мне ограничить скорость-то?



> > Verg © (27.08.03 10:13) [21]
> > Наверное никак.


Verg   (2003-08-27 10:16:00) [25]

Т.е. это возможно, но только средствами самого ядра TCP/IP протокола системы.


SPeller   (2003-08-27 10:15:00) [26]


> Reindeer Moss Eater © (27.08.03 10:10) [20]
> Это значит не вызывать методы чтения/записи.

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


> Verg © (27.08.03 10:13) [21]
> Наверное никак.

Так... В тупик пришли? Как же мне ограничить скорость-то?


Verg   (2003-08-27 10:13:00) [27]


> Вопрос, как остановить связь?


Наверное никак. Даже если вводить задержки в обработчик FD_READ, то просто объем следующего пакета будет больше, т.к. драйвера TCP продолжают принимать окна, просто буфферизируют данные пока ты "строишь из себя тормоз".


Reindeer Moss Eater   (2003-08-27 10:10:00) [28]

Вопрос, как остановить связь?
Это значит не вызывать методы чтения/записи.


SPeller   (2003-08-27 10:08:00) [29]

Ну погрешности возможны, мне не космический аппарат проектировать :). Я исходил из того, что время между вызовами обработчика почти равно времени приёма блока. Длина полученного блока известна. Таким образом, замеряя время между вызовами и вычисляя требуемое время, мы получаем и время простоя. Вопрос, как остановить связь?


Verg   (2003-08-27 10:07:00) [30]

Мнгновенная скорость определяется только канальным уровнем (Если 10 мБит/с - то ее никак не уменьшить). Средняя же скорость опередяется кроме этого еще и производительностью клиента-сервера. Т.е. если на обработку пакета в 1024 байта клиент будет тратить 1 секунду, то средняя скорость будет <1024 б/c. Таким образом, если необходимо добиться определенной средней скорости, то в обработчике пакета надо сделать искусственную задержку длительностью равной (<количество принятых байт>/<требуемая ср. скорость>) секунд.

> А почему не всё так просто?


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

В частном можно - например, ping это делает, но это специальный протокол. И определяет он время = <время передачи пакета в одну сторону>+<время реакции пингуемого>+<время передачи пакета в обратную сторону>

А так как в общем случае
<время передачи пакета в одну сторону>
<>
<время передачи пакета в обратную сторону>
то точно определить <время передачи пакета в одну сторону> не представляется возможным.


Reindeer Moss Eater   (2003-08-27 10:03:00) [31]

Трудно приостановить связь в асинхронном режиме?
Труднее определить момент полного приема/отправки блока.
Он не наступает в следующей строчке после Send.


SPeller   (2003-08-27 10:00:00) [32]

Да, это асинхронный обработчик. А почему не всё так просто? Трудно приостановить связь в асинхронном режиме?


Reindeer Moss Eater   (2003-08-27 09:58:00) [33]

Неа.
Если это у тебя один из обработчиков асинхронных компонентов, то так легко ты не отделаешься
Для асинхронной передачи реализация сложнее.


SPeller   (2003-08-27 09:54:00) [34]


> То есть, я получаю не блок

Сорри, опечатка :) Что-то другое хотел написать. а потом передумал :)

Значит, вид функции асинхронного чтения будет примерно такой:

procedure AsyncRead;
begin
GetTickCount
<Вычисляем время, за которое дошёл блок>
<Вычисляем время простоя>
<Замораживаем связь на нужное время>
GetTickCount
end;

Правильно?


Reindeer Moss Eater   (2003-08-27 09:49:00) [35]

То есть, я получаю не блок, например в 6 килобайт, смотрю за какое время он пришёл бы при заданной скорости и сплю это время. Немного не то.
Почему не то? В реальных условиях скорость передачи будет всегда непостоянной. Поэтому можно располагать реальными данными исключительно после приема передачи блока.
Чем меньше блок, тем точнее можно выдержать заданную скорость.

Как мне ещё вычислить, за какое время этот блок дошёл до меня?
GetTickCount до и GetTickCount после.


SPeller   (2003-08-27 09:45:00) [36]

То есть, я получаю не блок, например в 6 килобайт, смотрю за какое время он пришёл бы при заданной скорости и сплю это время. Немного не то. Как мне ещё вычислить, за какое время этот блок дошёл до меня?


Reindeer Moss Eater   (2003-08-27 09:42:00) [37]

Передаем/получаем - разницы нет.


SPeller   (2003-08-27 09:41:00) [38]


> Digitman © (27.08.03 09:33) [8]
> ты асинхронные OnRead()/OnWrite() события пользуешь ?
> или у тебя синхр.режим кл.гнезда ?

У меня компонент с асинхронным соединением.


> Reindeer Moss Eater © (27.08.03 09:34) [9]
> Берем блок длины X.
> Расчитываем время, необходимое на передачу при заданной
> скорости Y.
> Передаем блок.
> Меряем затраченное время. Если поторопились, спим столько,
> чтобы компенсировать разницу.
> Повторяем все с начала.

1. Блок длины Х - блок данных, как я понял. Так?
2. Куда его передаём-то в 3-м пункте? Может, получаем?


Reindeer Moss Eater   (2003-08-27 09:34:00) [39]

Берем блок длины X.
Расчитываем время, необходимое на передачу при заданной скорости Y.
Передаем блок.
Меряем затраченное время. Если поторопились, спим столько, чтобы компенсировать разницу.
Повторяем все с начала.


Digitman   (2003-08-27 09:33:00) [40]

ты асинхронные OnRead()/OnWrite() события пользуешь ?
или у тебя синхр.режим кл.гнезда ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо