【问题标题】:libcURL Progress Function not being called未调用 libcURL 进度函数
【发布时间】:2015-01-22 20:12:43
【问题描述】:

有问题的 cURL 版本/操作系统是 7.15 和 Red Hat 5,这些都是一成不变的,但无法更改。

根本没有被调用的实际进度函数

int CurlUtil::progressCallback(void *clientp, double dltotal, double dlnow,
                           double ultotal, double ulnow)
{
   DEFN_METHOD_NAME( "progressCallback" );
   EX_ENTRY_EXIT();

   EX_DEBUG("Total downloaded " << dlnow << "/" << dltotal);
   EX_DEBUG("Total uploaded " << ulnow << "/" << ultotal);

   CurlUtil* curlUtil = (CurlUtil*)clientp;

   // If you return anything but 0, curl will abort transfer
   return (true == curlUtil->killed()) ? 1 : 0;
}

设置代码:

curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(m_curl, CURLOPT_PROGRESSFUNCTION, CurlUtil::progressCallback);
curl_easy_setopt(m_curl, CURLOPT_PROGRESSDATA, this)

CurlUtil 是代码所在的类。CURLOPT_DEBUGFUNCTION 工作正常,并且以相同的方式在完全相同的函数中设置。

【问题讨论】:

  • 您是否 100% 确定实际正在传输数据?如果传输太快,也可能不会调用它。 progressCallback 是静态的吗?
  • 如果progressCallback() 未声明为static,则需要声明。您不能将非静态类方法用作回调(除非您将其包装在 thunk 中)。
  • ...如果 Remy's 或 Collin's cmets 有效,则问题是错误的...
  • 正在传输数据,函数声明为静态。我已经尝试了公共和私人的功能,但它们都没有被调用。

标签: c++ libcurl


【解决方案1】:

问题在于回调函数的调用约定。对于 gcc 编译器,它需要 __cdecl 或 /Gd 选项。如果函数已经是静态的,请检查编译器选项。使用 thiscall 调用约定调用 C++ 成员函数。 看看下面的链接,如果你想拥有一个负责处理传输状态和统计的类,它提供了更简洁的方法: How can I use a member function pointer in libcurl

PS:我的编辑速度较慢,因为我在进行交叉验证。因此发布作为答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2021-12-18
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多