c++如何使用Curl Multi-Interface连续循环
c++ How to continuously loop using Curl Multi Interface
im尝试使用curl多接口连续循环。我有一个定时器功能,需要一次连续循环4个url,然后转到下一个4,等等。我已经成功地让curl轮询我的句柄以了解其状态,但当句柄达到0时,我试图重置curl句柄,使用新的url再次循环,但不起作用。我的定时器功能保持正常工作,但curl多次停止,并使用相同的4个url给我相同的curl响应,尽管我每次都试图重置句柄。请帮忙,谢谢。。下面是我的代码片段。。
// Timer function that fires every 30 seconds with 4 different URL's each time
void timerFunction (QString url1,QString url2,QString url3,QString url4)
{
CURLMsg *msg = NULL;
std::string url1_ = url1.toStdString();
std::string url2_ = url2.toStdString();
std::string url3_ = url3.toStdString();
std::string url4_ = url4.toStdString();
CURLM *curlm;
int handle_count;
curlm = curl_multi_init();
CURL *curl1 = NULL;
curl1 = curl_easy_init();
CURL *curl2 = NULL;
curl2 = curl_easy_init();
CURL *curl3 = NULL;
curl3 = curl_easy_init();
CURL *curl4 = NULL;
curl4 = curl_easy_init();
if(curl1 && curl2 && curl3 && curl4)
{
curl_easy_setopt(curl1, CURLOPT_URL, url1_.c_str());
curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl1);
curl_easy_setopt(curl2, CURLOPT_URL, url2_.c_str());
curl_easy_setopt(curl2, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl2);
curl_easy_setopt(curl3, CURLOPT_URL, url3_.c_str());
curl_easy_setopt(curl3, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl3);
curl_easy_setopt(curl4, CURLOPT_URL, url4_.c_str());
curl_easy_setopt(curl4, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl4);
CURLMcode code;
while(1)
{
code = curl_multi_perform(curlm, &handle_count);
if(handle_count == 0)
{
qDebug() << "Handle is 0, CURL Processing is done -- Repeat Process ";
break;
}
while ((msg = curl_multi_info_read(curlm, &handle_count)))
{
if (msg->msg == CURLMSG_DONE)
{
qDebug() << msg->msg;
curl_easy_reset(curl1);
curl_easy_reset(curl2);
curl_easy_reset(curl3);
curl_easy_reset(curl4);
handle_count = 4;
code = curl_multi_perform(curlm, &handle_count);
}
}
}
}
curl_easy_reset清楚地说明:
重新初始化以前在指定CURL句柄上设置的所有选项设置为默认值。这将使句柄恢复到与它是在中使用curl_easy_init创建的。
它不会更改保存在句柄中的以下信息:live连接、会话ID缓存、DNS缓存、cookie和股票。
完成响应后,您需要对循环中的每个句柄使用curl_multi_remove_handle,然后使用curl_easy_cleanup。
但是,您还需要在循环之后使用curl_multi_cleanup来移除所有句柄。
你的代码看起来是这样的:
// Timer function that fires every 30 seconds with 4 different URL's each time
void timerFunction (QString url1,QString url2,QString url3,QString url4)
{
CURLMsg *msg = NULL;
std::string url1_ = url1.toStdString();
std::string url2_ = url2.toStdString();
std::string url3_ = url3.toStdString();
std::string url4_ = url4.toStdString();
CURLM *curlm;
CURL* eh = NULL;
int still_running = 0, i = 0, msgs_left = 0;
curlm = curl_multi_init();
CURL *curl1 = NULL;
curl1 = curl_easy_init();
CURL *curl2 = NULL;
curl2 = curl_easy_init();
CURL *curl3 = NULL;
curl3 = curl_easy_init();
CURL *curl4 = NULL;
curl4 = curl_easy_init();
if(curl1 && curl2 && curl3 && curl4)
{
curl_easy_setopt(curl1, CURLOPT_URL, url1_.c_str());
curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl1);
curl_easy_setopt(curl2, CURLOPT_URL, url2_.c_str());
curl_easy_setopt(curl2, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl2);
curl_easy_setopt(curl3, CURLOPT_URL, url3_.c_str());
curl_easy_setopt(curl3, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl3);
curl_easy_setopt(curl4, CURLOPT_URL, url4_.c_str());
curl_easy_setopt(curl4, CURLOPT_WRITEFUNCTION, writeCallback);
curl_multi_add_handle(curlm, curl4);
while(1)
{
curl_multi_perform(curlm, &still_running);
do {
int numfds = 0;
CURLMcode res = curl_multi_wait(curlm, NULL, 0, MAX_WAIT_MSECS, &numfds);
if (res != CURLM_OK) {
// handle error your way
}
curl_multi_perform(curlm, &still_running);
} while (still_running);
while ((msg = curl_multi_info_read(curlm, &msgs_left)))
{
if (msg->msg == CURLMSG_DONE)
{
eh = msg->easy_handle;
qDebug() << msg->msg;
curl_multi_remove_handle(curlm, eh);
curl_easy_cleanup(eh);
}
}
curl_multi_cleanup(cm);
}
}
还没有测试你的代码,但我修改了它,这样你就知道应该如何做了。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- c++如何使用Curl Multi-Interface连续循环
- 如何制作 arduino 串行循环(连续接收数字)
- 集合中不带 for 循环的 n 个连续项的总和
- 更好的做法:永远循环线程或连续线程
- C++ - 如何让移动的点连续循环
- 在我的程序中使用EOF,然后连续循环
- 想要以正弦曲线的形式在循环中连续将值从最小变为最大
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- 如何在for循环中同时使用deque的两个连续元素
- C++:当循环条件连续执行时,循环体从不执行
- C++程序 尝试连续运行两次写入循环时显示".. stopped working"错误
- 在while循环中使用if语句进行连续比较
- Qt 5.5主循环中的连续检查
- 连续 for 循环不会终止C++
- 连续输入字符,如多次使用循环的字符串
- 如何使用基于范围的循环语法在STL容器中的连续对上循环
- listen()是否连续运行,或者我是否需要循环它以保持在套接字上接收连接