通过SSL的“ curl_easy_send”和“ curl_easy_recv”:如何处理“ CURLE_AGAIN”?

时间:2018-11-02 11:08:44

标签: c++ ssl libcurl

curl_easy_sendcurl_easy_recv由于网络连接缓慢而无法立即发送数据时,返回CURLE_AGAIN

可以用libcurl包装套接字,并在该套接字上调用pollselect;如果调用curl_easy_send,我们将等到可以写入更多数据(即,将POLLOUTpoll一起使用),对于curl_easy_recv,我们将等到传入数据可用(即我们将POLLINpoll一起使用)。

这种方法不适用于SSL连接,因为即使我们读取SSL数据,OpenSSL可能也需要写入(例如,执行新的握手)。因此,即使我们使用curl_easy_send,也不知道是必须使用POLLIN还是POLLOUT

OpenSSL具有此问题的SSL_want功能。但是,如果要调用SSL_want,则需要指向SSL会话的指针。

我尝试使用CURLINFO_TLS_SSL_PTR获取OpenSSL会话指针;但是,当我们使用null时,此方法总是返回CURLOPT_CONNECT_ONLY

那么,如何通过SSL通过CURLE_AGAINcurl_easy_send以正确的方式处理curl_easy_recv

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。我不明白NULL团队出于什么原因实施libcurl的原因,即使通过SSL建立连接并且Curl对象仍然包含SSL会话指针,它也返回CURLINFO_TLS_SSL_PTR,但是可以没有以正确的方式退还。我只希望他们能在以后的版本中解决此问题,并且nullptr用户将不必发明自行车。

幸运的是,我们可以通过以下方式获得SSL会话(至少对于libcurl而言):

  1. 使用OpenSSL可以在Curl创建SSL上下文时获得它。
  2. 在此上下文中使用CURLOPT_SSL_CTX_FUNCTION可以拦截新的SSL会话创建事件。
  3. 将此SSL会话与SSL_CTX_set_info_callback函数配合使用,以正确的方式处理SSL_want