gpt4 book ai didi

c++ - 如何阻止 Curl 缓存数据

转载 作者:行者123 更新时间:2023-11-28 02:39:12 25 4
gpt4 key购买 nike

我有一个 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>

结果是 vieo 不断地流式传输,永不停止。所以我猜标签正在处理 MJPEG 帧的处理,而不是像以前那样导致崩溃。

我使用 FireFox 分析了上述两种情况下的 HTTP 请求和响应,看看是否有任何不同,结果如下:

粘贴到网络浏览器地址栏中的 URL:

URL pasted into webbrowser address bar

嵌入网页的 URL:

enter image description here

唯一的区别似乎是接受:参数

现在进入我真正的问题。我在我的 C++ curl 程序中使用了相同的 url,我看到了完全相同的行为,我在几分钟内收到视频数据,然后 curl 回调突然停止。

我在我的 curl 程序中使用了以下 header :

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 中的这种行为?我认为它必须缓存与浏览器的缓存方式相同。

最佳答案

抱歉,您得出了错误的结论,因此您有点找错了地方。

curl 不缓存任何内容,它只是向服务器发送一个 HTTP 请求(使用 CURLOPT_VERBOSE,您可以轻松检查它),然后将接收到的所有数据通过管道传输到您提供的写入回调。没有缓存,没有中间层,没有魔法。

如果您在流量本应结束之前停止获取流量,那是因为没有更多的数据被传递或被 libcurl 接收。它可能是停止发送的服务器,也可能是您网络中的某些干扰。 libcurl 发送了请求,它会一直等待数据到达,直到整个内容都已交付。

关于c++ - 如何阻止 Curl 缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com