簡體   English   中英

嘗試連接時取消curl_easy_perform

[英]Cancel curl_easy_perform while it is trying to connect

有沒有辦法可以取消C ++中的curl_easy_perform

我有一種情況,我試圖連接到脫機的網絡資源,而curl_easy_perform需要一定的時間才能返回CURLE_COULDNT_CONNECT 但是與此同時,用戶已關閉希望連接的UI,我想立即切斷curl連接,而不必等待它失敗。

我試過存儲我使用的curl指針:

CURL *pEasy = curl_easy_init ();

然后在做curl_easy_perform時,我打電話給

curl_easy_cleanup(pEasy);

為了釋放或“停止” curl連接,但它崩潰了,我從curl_easy_perform收到以下錯誤:

Unhandled exception at blah blah: Access violation reading location 0x00000004.

有沒有辦法可以取消連接嘗試???? 我已閱讀此鏈接: 如何立即取消卷曲操作? 但它似乎可以在成功連接后取消取消curl連接。

編輯-解決方案

我發現如果我打電話:

curl_easy_reset( pEasy );

然后

curlResult = curl_easy_perform ( pEasy );

幾乎立即返回結果CURLE_OPERATION_TIMEDOUT

我認為這就是我所需要的:)

您可以在線程中運行curl_easy_perform並保留CURL對象。

每當您要關閉連接curl_easy_setopt(m_chatCurl, CURLOPT_TIMEOUT_MS, 1)在CURL對象上調用curl_easy_setopt(m_chatCurl, CURLOPT_TIMEOUT_MS, 1)

這樣,連接將超時並且線程將能夠完成。

您可以預先設置連接超時 ,而不是取消嘗試,例如。

curl_easy_setopt(pEasy, CURLOPT_CONNECTTIMEOUT, 5);

雖然更改超時選項可能很好,因為它可能只是轉發給套接字本身,但我認為最好只是關閉套接字。

void terminateConnectionNow(CURL* curlHandle)
{
    curl_socket_t sockfd;
    auto res = curl_easy_getinfo(curlHandle, CURLINFO_ACTIVESOCKET, &sockfd);
    // ASSERT_EQ(res, CURLE_OK); - no point in doing anything if the socket is not there
    closesocket(sockfd);
}

無論套接字是在進行連接,發送,接收還是其他操作,關閉套接字都可以確保其完全斷開,因此在最后一刻都沒有機會將其連接。

curl_easy_cleanup相反,即使該操作是從另一個線程執行的,curl也不會崩潰- sockets本身由操作系統管理,因此關閉套接字是線程安全的。 然后,可以適當地防止curl受到來自套接字操作的錯誤的影響。 手動關閉套接字后,諸如curl_easy_recv類的curl_easy_recv將僅返回錯誤代碼,例如: CURLE_RECV_ERROR

在訪問curl-options和讀取套接字句柄時,這似乎是一個冒險的操作,設置超時也是如此。 但是,在讀取套接字句柄時,不會修改curl的狀態,只讀取緩存的套接字,因此我認為它是更安全的選擇。

為了安全起見,您可以獲取帶有回調的套接字並將其存儲在一邊,這樣您就可以從另一個線程訪問它,而無需完全觸摸卷曲句柄。 您可以在這里看到這種方法。

當然,關閉插座並不意味着卷曲手柄已關閉。 curl句柄仍然有效,您仍然需要確保使用curl_easy_cleanup銷毀了該句柄-但在確保所有線程均無法通過其connect / send / recv操作失敗並留下curl句柄之前,否則無需這樣做,否則,您可能會冒險訪問-違反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM