【问题标题】:How not to re-use existing connection on curl_easy_perform(), hangs on internet connection change如何不在 curl_easy_perform() 上重新使用现有连接,在 Internet 连接更改时挂起
【发布时间】:2023-03-04 01:58:01
【问题描述】:

详细,我注意到输出:

在第一次运行结束时:

* Connection #0 to host www.example.com left intact

在第二次运行开始时:

* Found bundle for host www.example.com: 0x24e3360 [can pipeline]
* Re-using existing connection! (#0) with host www.example.com

我想要一种重新使用现有连接的方法,或者在使用现有连接之前进行验证。

其他细节:

我正在使用 libCurl 'easy' 界面执行一些简单的网页下载。我有一个类,它在它的构造函数中初始化并设置了一些选项。在 perform 方法中,我添加了 url 选项,然后执行 curl_easy_perform(...)。

尝试使用我的班级进行操作,我注意到:

  • 如果第一个操作处于脱机状态,则下一个操作就像脱机一样(即使在线)
  • 如果第一次操作在线,然后关闭互联网连接,在下一次操作中,curl_easy_perform(...) 将挂起并且永远不会返回。

我想要基于当前互联网连接的更合适的行为和操作。 (我已经尝试在 perform 方法中清理并重新初始化 + 选项设置,这可行,但这似乎有点浪费。)

【问题讨论】:

  • 猜测一下,这是使用“简单”方法的代价;您不必处理错误情况,但随后会以您不希望的方式处理错误情况。您是否考虑过使用非“简单”的方法来解决您的问题?如果是这样,出了什么问题?

标签: c++ libcurl


【解决方案1】:

我去了:

curl_easy_setopt(myEasy_handle, CURLOPT_FORBID_REUSE, 1);

我在我的类的构造函数中添加了一次设置。这可能会减慢操作速度,但它似乎可以完成这项工作,并且可能比清理和重新初始化更快,或者使用另一个单独的连接到某个服务器进行互联网连接检查。

我使用它是因为它似乎比其他选项更适合我的程序。我为此查看的两个有用链接如下:link1link2

编辑:

我还添加了选项CURLOPT_TIMEOUT 来设置在easy_perform 期间互联网连接中断的情况下要等待多长时间才能停止。

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多