Как остановить Curl от кеширования данных

У меня есть сервер потокового видео HTTP, к которому я обращаюсь по URL:

https://192.168.50.23:8011/livevideo/8

Если я вставлю этот URL в адресную строку своего веб-браузера, я смогу увидеть живое видео, но через несколько минут оно перестает воспроизводиться. Если я убью браузер и повторю процесс, я смогу получить потоковое видео еще несколько минут, прежде чем он снова остановится.

Я подумал, что это должно быть связано с тем, что веб-браузер кэширует фреймы MJPEG и не хватает памяти, поэтому в качестве эксперимента я смоделировал простую HTML-страницу примерно так:

<!DOCTYPE html>
<html>
<body>
<img src="https://192.168.50.23:8011/livevideo/8" width="500" height="500">
</body>
</html>

В результате видео постоянно течет и никогда не останавливается. Поэтому я думаю, что тег имеет отношение к утилизации кадров MJPEG и не вызывает сбой, как раньше.

Я использовал FireFox для анализа HTTP-запросов и ответов для обоих сценариев выше, чтобы увидеть, есть ли что-то другое, и вот результаты:

URL вставлен в адресную строку веб-браузера:

URL вставлен в адресную строку веб-браузера

URL, встроенный в веб-страницу:

введите описание изображения здесь

Единственные различия, кажется, Принять: параметры.

Теперь перейдем к моей настоящей проблеме. Я использую тот же URL-адрес в моей программе C ++ curl, и я вижу точно такое же поведение, когда я получаю видеоданные в течение нескольких минут, а затем внезапно обратные вызовы curl прекращаются.

Я использовал следующие заголовки в моей программе curl:

CURL *pEasy = curl_easy_init ();
curl_easy_setopt ( pEasy, CURLOPT_USERNAME, user.c_str() );
curl_easy_setopt ( pEasy, CURLOPT_PASSWORD, pass.c_str() );
curl_easy_setopt ( pEasy, CURLOPT_URL, urlToConnectTo.c_str() );

//Set authentication
curl_easy_setopt ( pEasy, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
curl_easy_setopt ( pEasy, CURLOPT_SSL_VERIFYPEER, false );
curl_easy_setopt ( pEasy, CURLOPT_SSL_VERIFYHOST, false );

curl_easy_setopt ( pEasy, CURLOPT_HEADER, TRUE );
curl_easy_setopt ( pEasy, CURLOPT_NOBODY, FALSE );

curl_easy_setopt ( pEasy, CURLOPT_WRITEFUNCTION, OnReceiveHttpBodyResponse );
curl_easy_setopt ( pEasy, CURLOPT_WRITEDATA, pEasy );

struct curl_slist *headers=NULL;
curl_slist_append( headers, "User-Agent: MyCurlDll");
curl_slist_append( headers, "Content-Type: text/xml");
curl_slist_append( headers, "Connection: Keep-Alive");
curl_slist_append( headers, "Accept: image/png, text/xml, text/html, application/xml");
curl_slist_append( headers, "Cache-Control: max-age=0");
curl_easy_setopt(pEasy, CURLOPT_HTTPHEADER, headers);

curl_multi_add_handle(m_curlMulti, pEasy);

//Process this curl handle in another function

Что я могу сделать, чтобы остановить это поведение в CURL? Я предполагаю, что кэширование должно быть таким же образом, как это делал браузер.

0

Решение

Извините, но вы пришли к неверному выводу, и, таким образом, вы тут же лаете не на то дерево.

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

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

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector