В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
Здравствуйте, Аноним, Вы писали:
А>В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
[offtop]Зарегистрируйтесь и оценивайте время, которое тратят участники на ответы вам, а не пуляйте вопросами один за другим[/offtop]
Re[2]: InternetReadFile
От:
Аноним
Дата:
29.01.10 08:31
Оценка:
Уважаемый, De-Bugger, вы писали.
DB>Зарегистрируйтесь и оценивайте время, которое тратят участники на ответы вам, а не пуляйте вопросами один за другим
1. Хочу напомнить Вам, что форумы и существуют, для того чтобы на них задавать вопросы. И отвечать, а соответственно, тратить время на ответ, это дело сугубо добровольное.
2. Не думаю, что на ответ, который вы дали на мой предыдущий пост
, Вы затратили более полуминуты, но тем самым спасли, возможно, не один час моего времени
3. Хочу выразить вам глубочайшую признательность за Ваш короткий, но столь информативный ответ
Здравствуйте, Аноним, Вы писали:
А>В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
А что вам мешает выставить размер ожидаемого блока
Здравствуйте, 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>Передавайте в каждом сообщении первыми символами размер блока:
Проблемма в том, что инфа идёт с чужого сервака и я уверен, что предложение поменять формат пересылаемых данных не вызовет у владельцев сервака особого интузиащма...
Здравствуйте, Alexander G, Вы писали:
AG>InternetReadFileEx ?
Не решает проблему, потому что если выставить флаг IRF_NO_WAIT поток начинает крутится по циклу постоянно(даже если данные не пришли) и пожирает тики, надо чтобы InternetReadFile(или InternetReadFileEx) входила в состояние ожидания данных и возвращала данные только когда получила их, даже если это всего 1 байт
Просто если сервер никак не размечает отправляемые "блоки", то у клиента нет никакой возможности их разделить. На долгом пути от сервера эти "блоки" в принципе могут многократно разбиваться на более мелкие и опять склеиваться, причём "разделение" между блоками будет выглядеть просто как некоторая произвольная задержка между группами пакетов транспортного уровня, весьма условное разделение. Всё что можно сделать, это вычитывать из соединения данные блоками фиксированного размера, либо с помощью связки InternetQueryDataAvailable + InternetReadFileEx читать то, что доступно в данный момент. Но ни то, ни другое не гарантирует, что разделение на "блоки", сделанное на сервере, сохранится на клиенте.