я создаю простой клиент HTTP для загрузки конкретного файла из Интернета, я получил проблему, когда я читаю данные, вот мой цикл:чтение ответа HTTP
do{
client.readString(aux, 256);
req.append(aux);
}while(client.canRead());
клиент является TCPClient объект, это прекрасно, метод canRead использовать select() для проверки наличия доступных данных, я думаю, что программа быстро считывает данные, что иногда canRead вызывается перед новым доходом данных и возвращает false, поэтому я не читаю все ответ, чтобы доказать, что я говорю, я использую этот код:
AGAIN:
do{
client.readString(aux, 256);
req.append(aux);
}while((test = client.canRead()));
if(!test){
std::cout << "false\n";
std::cout << req << std::endl << std::endl;
system("pause>null");
goto AGAIN;
}
так w и я вернусь к AGAIN, есть больше данных для чтения, я знаю, что метод canRead работает нормально, проблема в том, что я не знаю, когда прекратить чтение данных, и зависеть от этого метода явно не рекомендуется. Чтобы решить эту проблему, я вижу только два решения: поместите некоторые задержки (Сон) на код или обработайте данные непосредственно из файла сокета, но прежде чем я попытаюсь это сделать, я пришел сюда, чтобы искать лучшие решения, есть ли официальный способ сделать это ? если кто-нибудь может мне помочь, я буду благодарен вам.
Вам нужно выяснить из заголовков http, сколько данных вам нужно будет прочитать. Это единственный надежный способ сделать это. – Mat
«Я знаю, что метод canRead работает нормально» - держу пари, что нет. из вашего описания это звучит как его неблокирование, но тогда ваша логика приложения неверна. –
Вам нужно полностью выбрать 'select' из этого цикла. Прочитайте спецификацию HTTP. – davmac