curl_easy_send
和curl_easy_recv
由于网络连接缓慢而无法立即发送数据时,返回CURLE_AGAIN
。
可以用libcurl
包装套接字,并在该套接字上调用poll
或select
;如果调用curl_easy_send
,我们将等到可以写入更多数据(即,将POLLOUT
与poll
一起使用),对于curl_easy_recv
,我们将等到传入数据可用(即我们将POLLIN
与poll
一起使用)。
这种方法不适用于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_AGAIN
和curl_easy_send
以正确的方式处理curl_easy_recv
?
答案 0 :(得分:0)
我终于找到了解决方案。我不明白NULL
团队出于什么原因实施libcurl
的原因,即使通过SSL建立连接并且Curl对象仍然包含SSL会话指针,它也返回CURLINFO_TLS_SSL_PTR
,但是可以没有以正确的方式退还。我只希望他们能在以后的版本中解决此问题,并且nullptr
用户将不必发明自行车。
幸运的是,我们可以通过以下方式获得SSL会话(至少对于libcurl
而言):
OpenSSL
可以在Curl创建SSL上下文时获得它。CURLOPT_SSL_CTX_FUNCTION
可以拦截新的SSL会话创建事件。SSL_CTX_set_info_callback
函数配合使用,以正确的方式处理SSL_want
。