Re: InternetReadFile
От: De-Bugger  
Дата: 28.01.10 13:14
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?


[offtop]Зарегистрируйтесь и оценивайте время, которое тратят участники на ответы вам, а не пуляйте вопросами один за другим[/offtop]
InternetReadFile
От: Аноним  
Дата: 28.01.10 11:18
Оценка:
В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
Re[2]: InternetReadFile
От: Аноним  
Дата: 29.01.10 08:31
Оценка:
Уважаемый, De-Bugger, вы писали.

DB>Зарегистрируйтесь и оценивайте время, которое тратят участники на ответы вам, а не пуляйте вопросами один за другим


1. Хочу напомнить Вам, что форумы и существуют, для того чтобы на них задавать вопросы. И отвечать, а соответственно, тратить время на ответ, это дело сугубо добровольное.
2. Не думаю, что на ответ, который вы дали на мой предыдущий пост
Автор:
Дата: 28.01.10
, Вы затратили более полуминуты, но тем самым спасли, возможно, не один час моего времени
3. Хочу выразить вам глубочайшую признательность за Ваш короткий, но столь информативный ответ
Автор: De-Bugger
Дата: 28.01.10

4. Очень бы хотелось, получить такой же лаконичный, но всё расставляющий по своим местам, ответ

Спасибо
Re: InternetReadFile
От: pjBrain  
Дата: 29.01.10 10:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?


А что вам мешает выставить размер ожидаемого блока
BOOL InternetReadFile(
  __in          HINTERNET hFile,
  __out         LPVOID    lpBuffer,
  __in          DWORD     dwNumberOfBytesToRead, // тут !!!
  __out         LPDWORD   lpdwNumberOfBytesRead
);
Re[2]: InternetReadFile
От: pjBrain  
Дата: 29.01.10 11:04
Оценка:
Здравствуйте, pjBrain, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


Передавайте в каждом сообщении первыми символами размер блока:
Код будет примерно таким (не учтена обрабока ошибок и возможность выхода из функции при (dwReaded != dwBufferSize))
PVOID pReadBuffer;
int   iBlockSize;      // Сюда будет писаться размер блока
bool  fData = false;
DWORD dwReaded, 
      dwBufferSize = sizeof(int);
pReadBuffer = &iBlockSize;

BOOL fNoReadError = TRUE;
while (fNoReadError = InternetReadFile(hRequest, pReadBuffer, dwBufferSize, &dwReaded)) // !! must be = (not ==)
{
   if (dwReaded)
   {
      if (fData)
      {
         ProcessData(pReadBuffer);  // Обрабатываете свой блок
         free(pReadBuffer);
         // Готовимся читать новый блок
         fData = false;
         pReadBuffer  = &iBlockSize;
         dwBufferSize = sizeof(int);
      } else
      {
         pReadBuffer  = malloc(iBlockSize);
         dwBufferSize = iBlockSize;
         fData = true;
      }
   } else
     break;   // все считано
}
...
Re[3]: InternetReadFile
От: Аноним  
Дата: 29.01.10 12:04
Оценка:
Здравствуйте, pjBrain, Вы писали:

B>Передавайте в каждом сообщении первыми символами размер блока:


Проблемма в том, что инфа идёт с чужого сервака и я уверен, что предложение поменять формат пересылаемых данных не вызовет у владельцев сервака особого интузиащма...
Re: InternetReadFileEx ?
От: Alexander G Украина  
Дата: 29.01.10 12:24
Оценка:
InternetReadFileEx ?
Русский военный корабль идёт ко дну!
Re[2]: InternetReadFileEx ?
От: Аноним  
Дата: 29.01.10 23:49
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>InternetReadFileEx ?


Не решает проблему, потому что если выставить флаг IRF_NO_WAIT поток начинает крутится по циклу постоянно(даже если данные не пришли) и пожирает тики, надо чтобы InternetReadFile(или InternetReadFileEx) входила в состояние ожидания данных и возвращала данные только когда получила их, даже если это всего 1 байт
Re[3]: InternetReadFileEx ?
От: Jolly Roger  
Дата: 30.01.10 03:21
Оценка:
Здравствуйте, Аноним, Вы писали:

InternetQueryDataAvailable пробовали?
"Нормальные герои всегда идут в обход!"
Re[3]: InternetReadFileEx ?
От: Jolly Roger  
Дата: 30.01.10 03:34
Оценка:
Здравствуйте, Аноним, Вы писали:

Просто если сервер никак не размечает отправляемые "блоки", то у клиента нет никакой возможности их разделить. На долгом пути от сервера эти "блоки" в принципе могут многократно разбиваться на более мелкие и опять склеиваться, причём "разделение" между блоками будет выглядеть просто как некоторая произвольная задержка между группами пакетов транспортного уровня, весьма условное разделение. Всё что можно сделать, это вычитывать из соединения данные блоками фиксированного размера, либо с помощью связки InternetQueryDataAvailable + InternetReadFileEx читать то, что доступно в данный момент. Но ни то, ни другое не гарантирует, что разделение на "блоки", сделанное на сервере, сохранится на клиенте.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.