簡體   English   中英

libcurl:連接保持活動如何工作?

[英]libcurl: how does connection Keep-Alive work?

如何與 libcurl 保持連接?

我想要的用法如下。 我想連接到支持Keep-Alive但在 90 秒不活動后關閉連接的服務器。 當某些事件(在此連接之外)發生時,我想偶爾執行POST ,並且我想讓連接保持活動狀態以減少延遲。 可能會發生超過 90 秒沒有事件發生的情況,所以我想要一種方法來告訴服務器我沒有空閑。

示例頁面非常好,但我沒有看到一個涉及Keep-Alivehttps : //curl.haxx.se/libcurl/c/example.html

我確實找到了CURLOPT_TCP_KEEPINTVLhttps://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 負責重新連接?

有人可以隨意將其編輯到我的原始帖子中。

HTTP 持久連接

正如多次所說:默認情況下,libcurl 會執行持久的 HTTP 連接。 你只需要重用 curl 句柄才能工作,如果你不想要它們,你必須主動要求不要讓它們持久化。 您使用什么 HTTP 方法並不重要。 GET、POST、HEAD 等都保持連接 - 除非發生異常情況。

然而,現代 libcurl 版本只會重用CURLOPT_MAXAGE_CONN秒(默認為 118 秒)的連接 - 因為成功重用的機會隨着時間的推移會很快減少。

有時您會看到客戶端使用Keep-Alive:標頭,但這是 HTTP/1.0 時代的遺留問題,在當今時代幾乎毫無意義。

如果連接在此問題中聲稱的 90 秒后關閉,那是因為服務器隨后關閉了空閑連接。 服務器就是這樣做的。 除了在服務器殺死它之前再次使用連接之外,您無法以任何其他方式阻止它們。

TCP保活

TCP keepalive 選項處於完全不同的級別。 這基本上是 TCP 在 N 秒不活動后通過連接發送數據包,以確保連接保持活動狀態(並檢測斷開的連接)。

libcurl 默認不啟用 TCP keepalive,請參閱CURLOPT_TCP_KEEPALIVE

暫無
暫無

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

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