[英]libcurl: how does connection Keep-Alive work?
如何與 libcurl 保持連接?
我想要的用法如下。 我想連接到支持Keep-Alive
但在 90 秒不活動后關閉連接的服務器。 當某些事件(在此連接之外)發生時,我想偶爾執行POST
,並且我想讓連接保持活動狀態以減少延遲。 可能會發生超過 90 秒沒有事件發生的情況,所以我想要一種方法來告訴服務器我沒有空閑。
示例頁面非常好,但我沒有看到一個涉及Keep-Alive
: https : //curl.haxx.se/libcurl/c/example.html
我確實找到了CURLOPT_TCP_KEEPINTVL
: https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPINTVL.html ,但我不清楚它應該如何工作。 在那個例子中,我們看到了代碼:
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* enable TCP keep-alive for this transfer */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
/* set keep-alive idle time to 120 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
/* interval time between keep-alive probes: 60 seconds */
curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
curl_easy_perform(curl);
}
說明如下:
長傳。 設置操作系統在發送 keepalive 探測之間等待的時間間隔(以秒為單位)。 並非所有操作系統都支持此選項。 (在 7.25.0 中添加)
兩個問題:
A) 在操作上,我如何使用它? 從描述來看,只要我保持curl
的范圍,連接就會保持打開狀態。 這樣對嗎? 然后我應該繼續做嗎
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
res = curl_easy_perform(curl);
每當我想POST
更多的數據,它會在同一個連接上發送,或者是有更多的東西?
B) 這些 keepalive 探針是什么,我在哪里可以閱讀更多關於它們的信息? 這是操作系統在我背后做的事情嗎? 我應該把這看作是:從我的應用程序的角度來看,連接神奇地活着,我不應該擔心嗎?
是的,我的意思是 HTTP Keep-Alive
,抱歉含糊不清。
從昨天開始,我發現 Daniel Stenberg 自己在這里回答了一個類似的問題: https : //stackoverflow.com/a/14148171/12874900
這回答了我的問題的 A) 部分。 但它不回答問題 B)。 我還需要知道:如果連接確實因任何原因死亡,我打算如何檢測它? 還是 libcurl 負責重新連接?
有人可以隨意將其編輯到我的原始帖子中。
正如多次所說:默認情況下,libcurl 會執行持久的 HTTP 連接。 你只需要重用 curl 句柄才能工作,如果你不想要它們,你必須主動要求不要讓它們持久化。 您使用什么 HTTP 方法並不重要。 GET、POST、HEAD 等都保持連接 - 除非發生異常情況。
然而,現代 libcurl 版本只會重用CURLOPT_MAXAGE_CONN秒(默認為 118 秒)的連接 - 因為成功重用的機會隨着時間的推移會很快減少。
有時您會看到客戶端使用Keep-Alive:
標頭,但這是 HTTP/1.0 時代的遺留問題,在當今時代幾乎毫無意義。
如果連接在此問題中聲稱的 90 秒后關閉,那是因為服務器隨后關閉了空閑連接。 服務器就是這樣做的。 除了在服務器殺死它之前再次使用連接之外,您無法以任何其他方式阻止它們。
TCP keepalive 選項處於完全不同的級別。 這基本上是 TCP 在 N 秒不活動后通過連接發送數據包,以確保連接保持活動狀態(並檢測斷開的連接)。
libcurl 默認不啟用 TCP keepalive,請參閱CURLOPT_TCP_KEEPALIVE 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.